在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这个算子算是图像历史上第一个特征点提取算法了,1977年提出的,很简单,拿来练手很合适。 算法原理如下: 1.选取一个合理的邻域遍历图像,这里是5*5邻域的。在邻域中依次计算,垂直,水平,对角与反对角四个相邻像素灰度的差的平方和,作为该邻域特征值。 大致就是下面这个样子:
公式:
这里k是窗口的半径。 2.从四个特征值中选最小的值作为该像素初次候选特征值。 公式:
3.设定一个阈值,将大于该阈值初次候选特征值的选为二次候选特征值。 4.设定一个邻域,将该邻域最大的二次候选特征值作为最终要选择的特征值。 原图:
处理后:
matlab代码如下: 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,[]);
算法整个过程还是很简单的,练习一下,顺便祭下这个特征值开山算法。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论