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 有兴趣可以试下别的 然后看特征点是不是减少得厉害些
- SIFT检测特征点之去除边缘不稳定噪声点
- SIFT特征点检测
- SIFT精确特征点之去除灰度伪特征点
- SIFT检测特征点之找到主方向
- SIFT检测特征点之生成128维描述子
- 鱼眼拼接之SIFT特征点检测之得到候选特征点
- SIFT特征中关键点检测技术研究
- 特征点检测学习_1(sift算法)
- 特征点检测学习_1(sift算法)
- 特征点检测学习_1(sift算法)
- 【opencv】 特征点检测 sift和surf
- 特征点检测学习_1(sift算法)
- 特征点检测学习_1(sift算法)
- 特征点检测学习_1(sift算法)
- 特征点检测学习_1(sift算法)
- 特征点检测学习_1(sift算法)
- 特征点检测学习_1(sift算法)
- 特征点检测:FAST and SIFT
- 选择屏幕联动下拉框
- CSS实现模块化效果
- sscanf,sscanf_s及其相关用法(字符串格式化为其他类型)
- ssh长时间不用连接中断。
- Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)
- SIFT检测特征点之去除边缘不稳定噪声点
- HBase表的架构原理
- 驻足,为了更好的驶向下一站
- 黄昏时刻挂满树梢的AE相册模板
- Python基础教程笔记——字典:当索引不好用时
- ASIHTTPRequest开源类项目导入问题及解决方法
- java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
- JAVA 计算地球上任意两点(经纬度)距离
- 仁义礼智信,温良恭俭让