SIFT检测特征点之去除边缘不稳定噪声点

来源:互联网 发布:淘宝轮毂店 编辑:程序博客网 时间:2024/04/30 21:39
根据论文以及这位女侠

http://blog.csdn.net/abcjennifer/article/details/7639681

所述,在用SIFT得到候选特征点之后  还要进一步精确特征点  因为候选特征点中有两部分特征点需要去除掉  第一个是灰度伪特征点  即 从一个灰度比较小的区域由26个像素比较得到的极值点  其实并不是特征点  第二个是边缘不稳定噪声点  因为第一个难编一点  我先去除第二个边缘不稳定噪声点    公式里是对x,y和sigma求偏导  在编程时就用差分近似代替求偏导   


昨天得到D12即DOG差分空间  以及装着特征点位置的E11  下面就用这两个就行了


 A=imread('F:\orl_zhifangtu\s1.jpg');
T=40;
[A,R]=kuaisusaomiao(A,T);
[m,n,H]=size(A);
C=[];
x=n/2;
y=m/2;
for u=1:m
    for v=1:n
        i=u;
        j=round(sqrt(R^2-(y-u)^2)*(v-x)/R+x);
        if(R^2-(y-u)^2<0)
            continue;
        end
        C(u,v,1)=A(i,j,1);
        C(u,v,2)=A(i,j,2);
        C(u,v,3)=A(i,j,3);
    end
end
C=uint8(C);
C=rgb2gray(C);
H=C;
C=double(C);
[m1,n1,h1]=size(C);
k=2^(1/3);
threshold=3;
h11=fspecial('gaussian',[5 5],0.3);
C11=imfilter(C,h11,'conv');
h12=fspecial('gaussian',[5 5],0.4);
C12=imfilter(C,h12,'conv');
h13=fspecial('gaussian',[5 5],0.5);
C13=imfilter(C,h13,'conv');
h14=fspecial('gaussian',[5 5],0.6);
C14=imfilter(C,h14,'conv');
h15=fspecial('gaussian',[5 5],0.7);
C15=imfilter(C,h15,'conv');
h16=fspecial('gaussian',[5 5],0.8);
C16=imfilter(C,h16,'conv');
D11=C11-C12;
D12=C12-C13;
D13=C13-C14;
D14=C14-C15;
D15=C15-C16;
E11=zeros(m1,n1);
for i=3:m1-2
    for j=3:n1-2
        if(D12(i,j)>D12(i-1,j-1) && D12(i,j)>D12(i,j-1) && D12(i,j)>D12(i+1,j-1) && D12(i,j)>D12(i-1,j) && D12(i,j)>D12(i+1,j) && D12(i,j)>D12(i-1,j+1) && D12(i,j)>D12(i,j+1) && D12(i,j)>D12(i+1,j+1))
            if(D12(i,j)>D11(i,j) && D12(i,j)>D11(i-1,j-1) && D12(i,j)>D11(i,j-1) && D12(i,j)>D11(i+1,j-1) && D12(i,j)>D11(i-1,j) && D12(i,j)>D11(i+1,j) && D12(i,j)>D11(i-1,j+1) && D12(i,j)>D11(i,j+1) && D12(i,j)>D11(i+1,j+1))
                if(D12(i,j)>D13(i,j) && D12(i,j)>D13(i-1,j-1) && D12(i,j)>D13(i,j-1) && D12(i,j)>D13(i+1,j-1) && D12(i,j)>D13(i-1,j) && D12(i,j)>D13(i+1,j) && D12(i,j)>D13(i-1,j+1) && D12(i,j)>D13(i,j+1) && D12(i,j)>D13(i+1,j+1))
                    if(D12(i,j)>threshold)
                         E11(i,j)=1;
                    end
                end
            end
        elseif(D12(i,j)<D12(i-1,j-1) && D12(i,j)<D12(i,j-1) && D12(i,j)<D12(i+1,j-1) && D12(i,j)<D12(i-1,j) && D12(i,j)<D12(i+1,j) && D12(i,j)<D12(i-1,j+1) && D12(i,j)<D12(i,j+1) && D12(i,j)<D12(i+1,j+1))
            if(D12(i,j)<D11(i,j) && D12(i,j)<D11(i-1,j-1) && D12(i,j)<D11(i,j-1) && D12(i,j)<D11(i+1,j-1) && D12(i,j)<D11(i-1,j) && D12(i,j)<D11(i+1,j) && D12(i,j)<D11(i-1,j+1) && D12(i,j)<D11(i,j+1) && D12(i,j)<D11(i+1,j+1))
                if(D12(i,j)<D13(i,j) && D12(i,j)<D13(i-1,j-1) && D12(i,j)<D13(i,j-1) && D12(i,j)<D13(i+1,j-1) && D12(i,j)<D13(i-1,j) && D12(i,j)<D13(i+1,j) && D12(i,j)<D13(i-1,j+1) && D12(i,j)<D13(i,j+1) && D12(i,j)<D13(i+1,j+1))
                    if(D12(i,j)<-threshold)
                        E11(i,j)=-1;
                    end
                end
            end
        end
    end
end

以上部分和昨天的一样 即得到候选特征点

[X,Y]=find(E11==1 | E11==-1);
[M,N]=size(X);
r=10;

此时的候选点有1756个 可以从MATLAB里看到


接下来去除不稳定噪声点

for i=1:M

    dxx=D12(X(i),Y(i)+1)+D12(X(i),Y(i)-1)-2*D12(X(i),Y(i));
    dyy=D12(X(i)+1,Y(i))+D12(X(i)-1,Y(i))-2*D12(X(i),Y(i));
    dxy=(D12(X(i)+1,Y(i)+1)-D12(X(i)+1,Y(i)-1)-D12(X(i)-1,Y(i)+1)+D12(X(i)-1,Y(i)-1))/4;
    tr=dxx+dyy;
    det=dxx*dyy-dxy*dxy;
    if(det<=0)
        E11(X(i),Y(i))=0;
    end
    if(tr*tr/det>(r+1/r+1))
        E11(X(i),Y(i))=0;
    end
end

再在原图上显示出来

 [X11,Y11]=find(E11==1 | E11==-1);
imshow(H)
hold on
plot(Y11,X11,'rx')


如果有心  可以把图放大了看到特征点的确少了一些  不放大也行 从数据也可以看到 现在特征点的数目只有1593个了  之前是1756个的  少了163个不稳定噪声点  当然 这个一下去除力度的大小可以通过参数调节  我这里取的r=10  有兴趣可以试下别的  然后看特征点是不是减少得厉害些

0 0
原创粉丝点击