Zernike Moments Feature

Zernike矩是一种正交复数矩。

最近在研究3D 图片的检索问题,需要提取一些图片的特征

因为Zernike具有良好的旋转不变的特性,于是采用了这个特征。

但是没有接触过,对气的理解还不够充分,很多算法中都用的了一个49个洗漱的Zernike特征。

这里给出结论,简单了解后,我们知道一个Zernike矩由两个数决定,m和n

一组m和n会得到一个Zernike的结果,或者是数字。

这里m=0,1,2,......,到无穷

n是一个整数,但是有一定的条件:m-|n|是偶数,同时|n|<=m。

于是,我们可以发现,如果m从0到12,n同样从0到12

那么计算后,正好是49个系数。这个是我的理解,不知道对不对。

这里给出计算的代码:

function f=zernikefeature(image)
number = 12;
count = 1;
p = rgb2gray(image);
p = logical(not(p));
for n=0:1:12
    for m=-12:1:12
        temp = n-abs(m);
        if mod(temp,2)==0&&n>=abs(m)
            [t, a, tempp] = Zernikmoment(p,n,m);
            r(count,1) = n;
            r(count,2) = m;
            f(count) = a;
            count = count+1;
        end
    end
end

其中Zernikemoment的代码如下:

function [Z A Phi] = Zernikmoment(p,n,m)

N = size(p,1);
x = 1:N; y = x;
[X,Y] = meshgrid(x,y);
R = sqrt((2.*X-N-1).^2+(2.*Y-N-1).^2)/N;
Theta = atan2((N-1-2.*Y+2),(2.*X-N+1-2));
R = (R<=1).*R;
Rad = radialpoly(R,n,m);    % get the radial polynomial

Product = p(x,y).*Rad.*exp(-1i*m*Theta);
Z = sum(Product(:));        % calculate the moments

cnt = nnz(R)+1;             % count the number of pixels inside the unit circle
Z = (n+1)*Z/cnt;            % normalize the amplitude of moments
A = abs(Z);                 % calculate the amplitude of the moment
Phi = angle(Z)*180/pi;      % calculate the phase of the mement (in degrees)


Radiapoly代码如下:

function rad = radialpoly(r,n,m)

rad = zeros(size(r));                     % Initilization
for s = 0:(n-abs(m))/2
  c = (-1)^s*factorial(n-s)/(factorial(s)*factorial((n+abs(m))/2-s)*factorial((n-abs(m))/2-s));
  rad = rad + c*r.^(n-2*s);
end

对Zernike的理解,还是不够充分,为什么会有选择不变的特性等。

但是我感觉,在3Dmodel的检索中运用跟这个特征并不是一个很好的选择。

实验效果并没有比HoG和HSV好多少。

希望大家提出意见。



你可能感兴趣的:(Matlab)