Forstner算子是Forstner(1986)在研究基于特征的影像匹配时提取的兴趣算子,该算子本身也具有吸引人的特征,因为它不仅能找到具有精确视察的点,同时它还能确定由任意数量和方向的边缘所形成的角点及圆、圆形影像片与圆环的中心。
代码(参考超人琪的博客):
F=imread('2053146.jpg');
f=rgb2gray(F);
figure(1);
imshow(F);%显示原始标准影
%判断是否为彩色图像,是彩色则转换为灰度图像
[x,y,z]=size(F);
figure(2);
imshow(f);%显示灰度图像
%lever=graythresh(pic_gray);%二值图像的阈值
f2=im2bw(f,0.9);%把灰度图像转换成二值图像,阈值可调
figure(3);
imshow(f2);
%第一步:先用4个方向的差分算子提取初选点
result=zeros(x,y);%特征提取结果
for i=2:x-1
for j=2:y-1
dg1=abs(f2(i,j)-f2(i+1,j));
dg2=abs(f2(i,j)-f2(i,j+1));
dg3=abs(f2(i,j)-f2(i-1,j));
dg4=abs(f2(i,j)-f2(i,j-1));
dg=[dg1,dg2,dg3,dg4];
temp=sort(dg);%对四个差分算子进行升序排列
if temp(3)==1%有任意两个大于阈值,则该像素有可能是一特征点
result(i,j)=255;%是初选点
else
result(i,j)=0;%不是初选点
end
end
end
figure(4);
imshow(result);
%第二步:在以初选点为中心的3*3窗口中计算协方差矩阵与圆度
f3=zeros(x,y);%权重矩阵
Tq=0.8;%阈值,可设置
for i=2:x-1
for j=2:y-1
if result(i,j)==255%如果是初选点
gu2=0.0;
gv2=0.0;
guv=0.0;
for ii=i-1:i
for jj=j-1:j
gu2=gu2+(f2(ii+1,jj+1)-f2(ii,jj))^2;
gv2=gv2+(f2(ii,jj+1)-f2(ii+1,jj))^2;
guv=guv+(f2(ii+1,jj+1)-f2(ii,jj))*(f2(ii,jj+1)-f2(ii+1,jj));
end
end
DetN=gu2*gv2-guv^2;
trN=gu2+gv2;
q=4*DetN/(trN*trN);
%第三步:设点该阈值Tq,若满足则计算权值
if q>Tq
f3(i,j)=DetN/trN;
else
result(i,j)=0;
end
end
end
end
figure(5);
imshow(result);
%第四步:以权值为基础,在一定窗口内抑制非最大候选点,取出局部极大值点
w=5;%选择5*5的窗口
W=floor(w/2);
for i=W+1:x-W
for j=W+1:y-W
if result(i,j)==255
f4= f3(i-W:i+W,j-W:j+W);
f5=sort(f4(:),'descend');
if f3(i,j)==f5(1)&&f3(i,j)~=f5(2);
else
result(i,j)=0;
end
end
end
end
figure(6);
imshow(result);
运行结果:
省略了中间的几张图片,运行代码就可以看见了。(尽量找一些质量较好的图片,不然到最后提取出的点很少)。