在阅读这篇博文前假设您已经知道了滤波运算和相关运算是怎么回事,不清楚的同学可以参考下面这篇博文:
https://blog.csdn.net/zhuwei0710/article/details/68169317
好,有了上面的基础之后,我们来说什么孤立点检测的原理。
孤立点检测是指将嵌在一幅图像的恒定区域或亮度几乎不变的区域里的孤立点检测出来,说简单点,就是某个点如果在某个区域内其值与周围像素点的值差异过大,则可认为是一个孤立点。
通常使用相关响应法(滤波法)来进行这类孤立点的检测。
相关运算和滤波运算都是用一个掩模(又称为窗口)去滑动,然后做加权的求和运算。
掩模在图像中任何一点的相关响应R由下式给出:
R
=
w
1
z
1
+
w
2
z
2
+
⋯
+
w
9
z
9
=
∑
i
=
1
9
w
i
z
i
R=w_1z_1+w_2z_2+ \cdots+w_9z_9 \\ \quad =\sum\limits_{i=1}^{9}{w_iz_i}
R=w1z1+w2z2+⋯+w9z9=i=1∑9wizi
这里我们使用的掩模如下:
即w = [-1 -1 -1;-1 8 -1;-1 -1 -1];
由于这个掩模旋转180度后仍然等于其自它,所以对于这个掩模而言,相关运算和滤波运算的运算结果是一样的,所以既可以说是用相关响应法进行孤立点检测,也可以说是用滤波法进行孤立点检测。
使用MATLAB编写示例程序如下:
%这个脚本用于学习孤立点检测
%作者微信/QQ 2487872782
%有问题可以联系作者交流
A1 = [4 4 4;4 0 4;4 4 4];
A2 = [4 4 4;4 5 4;4 4 4];
A3 = [4 4 4;4 7 4;4 4 4];
w = [-1 -1 -1;-1 8 -1;-1 -1 -1];
g1 = abs(imfilter(A1,w));
g2 = abs(imfilter(A2,w));
g3 = abs(imfilter(A3,w));
A1,A2,A3 的截图如下:
g1,g2,g3的截图如下:
从以上结果可以看出,当中间的那个假想孤立点与周围的值差别不大时,其相关运算结果值较小;而当中间的那个假想孤立点与周围的值差别较大时,其相关运算结果值较大。通过这样的运算,我们便可以挑选出那些孤立点了。
最后来一个孤立点检测的完整示例吧!
MATLAB代码如下:
代码中用到的图片下载地址:
链接:https://pan.baidu.com/s/1DVojpl726Rv38MtO7Ue77g 提取码:orst
%这个脚本用于学习孤立点检测
%作者微信/QQ 2487872782
%有问题可以联系作者交流
img1 = imread('F:\material\images\P0007-single_pixel_01.tif');
w = [-1 -1 -1;-1 8 -1;-1 -1 -1];
g = abs(imfilter(tofloat(img1),w));
T = max(g(:)); %在滤波后图像中选择的最大值
g = g >=T;
f1=figure(1);
set(f1,'name','孤立点检测','Numbertitle','off')
subplot(1,2,1);
imshow(img1);
subplot(1,2,2)
imshow(g,[]);
代码中用到的函数tofloat()的m文件下载地址:
链接:https://pan.baidu.com/s/1R7UjDEQ9VAxaZYbbGIl2Og 提取码:hyh4
为什么在做相关运算前要先将图像数据类型转换成浮点型?
原因见我的博文:https://blog.csdn.net/wenhao_ir/article/details/124154493
运行结果如下:
程序说明:原图像“P0007-single_pixel_01.tif”的东北象限有一个几乎不可见的黑点,我们可以用上述孤立点检测的代码将其检测出。