這個算子算是圖像曆史上第一個特征點提取算法了,1977年提出的,很簡單,拿來練手很合适。
算法原理如下:
1.選取一個合理的鄰域周遊圖像,這裡是5*5鄰域的。在鄰域中依次計算,垂直,水準,對角與反對角四個相鄰像素灰階的差的平方和,作為該鄰域特征值。
大緻就是下面這個樣子:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SY1YTOjRTY3QWZxETMwgjYhFmY2IGM3QTM5MWY3MjZx8CXxAzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
這裡k是視窗的半徑。
2.從四個特征值中選最小的值作為該像素初次候選特征值。
3.設定一個門檻值,将大于該門檻值初次候選特征值的選為二次候選特征值。
4.設定一個鄰域,将該鄰域最大的二次候選特征值作為最終要選擇的特征值。
原圖:
1 clear all;close all;clc
2
3 img=double(imread('lena.jpg'));
4 [h w]=size(img);
5 imshow(img,[])
6
7 imgn=zeros(h,w);
8 n=4;
9 for y=1+n:h-n
10 for x=1+n:w-n
11 sq=img(y-n:y+n,x-n:x+n);
12 V=zeros(1,4);
13 for i=2:2*n+1 %垂直,水準,對角,反對角四個方向領域灰階差的平方和
14 V(1)=V(1)+(sq(i,n+1)-sq(i-1,n+1))^2;
15 V(2)=V(2)+(sq(n+1,i)-sq(n+1,i-1))^2;
16 V(3)=V(3)+(sq(i,i)-sq(i-1,i-1))^2;
17 V(4)=V(4)+(sq(i,(2*n+1)-(i-1))-sq(i-1,(2*n+1)-(i-2)))^2;
18 end
19 pix=min(V); %四個方向中選最小值
20 imgn(y,x)=pix;
21 end
22 end
23
24 T=mean(imgn(:)); %設門檻值,小于均值置零
25 ind=find(imgn<T);
26 imgn(ind)=0;
27
28 for y=1+n:h-n %選局部最大且非零值作為特征點
29 for x=1+n:w-n
30 sq=imgn(y-n:y+n,x-n:x+n);
31 if max(sq(:))==imgn(y,x) && imgn(y,x)~=0
32 img(y,x)=255;
33 end
34 end
35 end
36
37 figure;
38 imshow(img,[]);