边缘检测
边缘点指的是图像中周围像素灰度有阶跃变化或屋顶变化的那些像素点(灰度值导数较大或极大的地方)
边缘检测可以减少数据量并剔除那些认为不相关的信息,保留图像重要的结构信息
增强边缘的图像锐化方法用于边缘检测(Canny算子专门用于边缘检测)
边缘检测的基本步骤:
原始图像(经过平滑滤波)得到平滑图像
平滑图像(经过锐化滤波)得到锐化图像
锐化图像(经过边缘检测)得到二值图像
二值图像(经过边缘连接)得到边缘图像
简称:平锐边检边连边缘检测处理过程中存在的问题:
①平滑滤波:由于图像中有噪声,其对梯度计算操作的影响很大,所以要进行去噪操作。
但是对于边缘处的像素来说,本身就拥有噪声这方面的特征,故造成图像边缘损失
②锐化滤波:将经过中值滤波处理后的图像中有意义的灰度局部变化位置的像素点进行加强
③边缘判定:由于图像中存在许多梯度非0的点,但其中很多并不是对边缘判定有意义的点,反而有的是干扰点。
此时,就需要使用二值化处理和过零检测等操作
④边缘连接:将间断的边缘连接成有意义的完整边缘,同时去除假边缘。这个过程使用的是Hough变换边缘检测方法的算法:
①基于查找的算法(一阶导数的边缘检测算法):Roberts算子、Sobel算子、Prewitt算子
通过寻找图像中一阶导数中的最大值和最小值来检测边界,通常是将边界定位在梯度最大的方向
(1)Roberts算子
利用局部差分算子寻找边缘,边缘定位精度较高,容易失去一部分边缘,由于图像没有经过平滑处理,不具有抑制噪声的能力。
该算子对具有陡峭的边缘且噪声较少的图像边缘检测效果较好
(2)Sobel算子、Prewitt算子
两种边缘检测算法都考虑了邻域信息,对该部分信息进行先加权平滑处理,再进行微分运算,由于加权运算的值存在各个像素不同的原因,
使得具有一定的抑制噪声的能力,但是不能完全排除结果中出现的虚假边缘,使得结果往往容易出现多像素宽度的问题,整体处理效果还是不错的!
②基于零穿越的算法(二阶导数的边缘检测算法):高斯-拉普拉斯边缘检测算子(Log算子)
通过查找图像二阶导数零穿越来寻找边界,通常使用的是拉普拉斯过零点或者非线性差分表示的过零点
(1)高斯-拉普拉斯边缘检测算子
由于其是一个二阶导数,对噪声非常敏感,其会产生双边缘以及边缘方向的不可检测性也是拉普拉斯本身的缺点。
为了解决这个缺点,可以在对图像进行处理前,先使用高斯低通滤波进行处理,使得图像噪声得到抑制,同时使得明显的边缘也被平滑掉,造成该部分的边缘检测困难
以上是对图像进行平滑处理后的通病就是造成在去除噪声的同时,也增加了边界检测的不确定性,在提高了对边缘的敏感性的同时,同时也提高了对噪声敏感性的问题
(因为噪声是高频,边缘也是高频,怎么区分是个问题,平滑都对两者进行了虚弱,边缘敏感的判定存在不确定性)
③Canny边缘检测算法:
对图像首先采用高斯滤波器进行平滑滤波,然后采用非极值抑制技术进行处理得到最后的边缘图像(保留局部梯度最大值,而抑制非极大值并将其置零)
I=imread('rice.png');% rice.png
image_1=edge(I,'sobel');
image_2=edge(I,'prewitt');
image_3=edge(I,"roberts");
image_4=edge(I,'log');
image_5=edge(I,'canny');
subplot(2,3,1),imshow(I),title('orginal');
subplot(2,3,2),imshow(image_1),title('sobel');
subplot(2,3,3),imshow(image_2),title('prewitt');
subplot(2,3,4),imshow(image_3),title('roberts');
subplot(2,3,5),imshow(image_4),title('log');
subplot(2,3,6),imshow(image_5),title('canny');
效果分析
可以很明显的感受到canny的边缘检测效果是很不错的,其余的问题见如下图中的红线部分
可能rice.png的图片细节不够多,导致效果不少很明显可以区分好坏,这样换成circuit.tif来看看效果,从定位精度和边缘方向敏感度看,Canny的处于折中的程度。