实验八 数字图像的边缘检测
一、实验目的
- 掌握图像边缘检测的概念及其计算方法;
- 熟练使用matlab实现图像的傅里叶变换;
二、实验环境
- PC计算机
- MatLab软件/语言包括图像处理工具箱(Image Processing Toolbox)
- 实验所需要的图片
- 实验原理
自己写各种边缘检测算法的原理!
1. Roberts算子
Roberts 算子即交叉微分算子,是基于交叉差分的梯度算子。该算法通过局部差分来计算检测图像的边缘线条,常常被用来检测边缘明显,亮度差异大的低噪声图像。
Roberts交叉微分算子分为水平部分算子和垂直部分算子,有两个2*2的滤波算子组成:
其中为Sx水平方向滤波算子,Sy为垂直方向滤波算子。
假设设原图像为当然可以从上式f(i,j)中推测出该算子的详细计算公式:
其中Sx(i,j)为该像素水平方向滤波值,Sy(i,j)为该像素垂直方向滤波值。
该像素Roberts算子的最终计算公式如下:
对于该算法来说,当图像边缘接近于正 45° 或负 45° 时,该算法处理效果最为理想。然而该算法的一些不足在于边缘的定位不太准确,图像的噪声污染没有被排除以及检测出来的边缘轮廓较粗等。
2. Prewitt算子
Prewitt算子利用特定区域内的像素灰度值产生的差分信息来完成图像的边缘检测。与Roberts算子采用3x3的滤波算子不同的是Prewitt算子采用了3x3的算子来对图像特定区域中的像素值进行计算,这导致了 Prewitt 算子的边缘检测轮廓在水平部分和垂直部分都比 Robert算子检测出来的边缘要更加明显。它的两个3x3的滤波算子如下:
并且该像素Prewitt算子的最终计算公式如下:
传统的Prewitt算子认为所有像素点中那些被计算出来的新灰度值大于或等于某一个特定值的都是边缘点。该理论认为可以适当的选择特定值T,当S(i, j) ≥ T,则可以认为像素点(i, j)为边缘点;否则就不是像素点。其实这种判定方法是不合理的,过于单一化和绝对化并且将造成一些像素点的误判。因为有些噪声点的灰度值也很大(特别是对于椒盐噪声来说)并且有些边缘点的灰度值较小,这两种情况均会导致边缘点的错误认定。而且虽然Prewitt算子通过对该像素点周围的灰度值进行平均来对噪声进行抑制,但是这种类型的噪声抑制仅仅是相当于对图像进行一次低通滤波操作,这将导致Prewitt算子对图像边缘的识别效果不如Roberts算子。
3. Sobel算子
Sobel算子结合了高斯模糊和一阶微分并计算图像明暗程度的近似值,通过比较图像边缘的明暗程度把该区域内超过阈值的特定像素点记为边缘点。该算法在Prewitt算子的基础上增加了距离权重的概念,处于临域但不同距离的像素点对当前像素点造成的变化也是不同的:距离越近的像素点对于当前的像素点的影响越大。从而该算法实现了对距离进行加权,完成了对图像的锐化并突出了图像的边缘轮廓。由于该算法同Prewitt算法一样引入了像素的灰度值平均化处理,因此能够过滤掉图像的噪声、抑制噪声对边缘检测结果影响。
Sobel算子同Prewitt一样,使用两组3x3的滤波算子
Sobel算子通过结合了高斯模糊和一阶微分这两种模型使边缘检测的结果具有较高的抗噪声干扰的能力。然而该算法的缺点是没有将图像的主题和背景严格的划分开,这可能导致边缘轮廓模糊。
4. Canny算子
Canny算子是一个综合了滤波,增强,检测等多阶段的边缘检测算子, 其目标是找到一个最优的边缘轮廓。该算法对最优的边缘的定义是:
好的检测——算法能够尽可能多地标示出图像中的实际边缘
好的定位——算法标示出的边缘要与实际的边缘尽可能地相同
最小响应——图像中的边缘只能被标示一次,并且可能存在的图像噪声点不应该被标示为边缘点
3.梯度图像的非极大值抑制处理
由2得到的梯度图像存在边缘宽度不均、模糊和误识别问题,因此需要对梯度图像的非极大值点进行抑制来剔除那些非边缘的像素点。通过使用非极大值抑制法来寻找到梯度图像中局部最大值的那些点来作为边缘点,并将非极大值所对应点的灰度值置0就可以形成细且准确的单像素边缘。
具体的操作方法为将每个像素点与梯度相同的两个邻域像素点相比。如果的梯度值不是这三个像素点中的极大值时就对这个像素点进行抑制,即令这个像素点为零.
4.双阈值算法检测并连接图像边缘
步骤3得到的边缘图像还是存在很多伪边缘,因此Canny算法使用双阈值算法对边缘进行检测和连接。具体的思路为选取两个阈值,小于低阈值的像素点确定为假边缘;而大于高阈值的像素点将被确定为强边缘;而介于两个阈值中间的像素点需根据特定的规则进一步的进行判定。通常这两个阈值的大小为1:2或1:3。
以高阈值判定后形成的像素点为基础将那些像素点连接成边缘。当连接到边缘的端点时,在它们的8邻域像素点中重新确定那些满足低阈值的像素点作为新的边缘点,再以此为基础继续检测和连接新的边缘点直到轮廓闭合。这种算法能够准确的寻找到图像的弱边缘点并形成精确的图像边缘,但是计算量大,效率不高。
- 实验步骤和结果
- 读取图像,并显示。
- 分别用Roberts、Sobel和拉普拉斯高斯算子对图像进行边缘检测。比较三种算子处理的结果。
代码:BW1 = edge(I,'sobel');
BW2 = edge(I,'roberts');
BW4 = edge(I,'log');
figure(1)
imshow(I),title('原图');
figure(2)
subplot(1,3,1),imshow(BW1),title('用sobel算20101110227');
subplot(1,3,2),imshow(BW2),title('用roberts算子20101110227');
subplot(1,3,3),imshow(BW4),title('用拉普拉斯高斯算子20101110227');
- 用不同方向(‘水平’、‘垂直’、‘水平和垂直’)的Sobel算子对图像进行边缘检测。比较三种情况的结果。
代码:
BW1=edge(A,'sobel','horizontal');
BW2=edge(A,'sobel','vertical');
BW3=edge(A,'sobel','both');
subplot(2,2,1);imshow(A),title('原图像');
subplot(2,2,2);imshow(BW1),title('水平方向20101110227');
subplot(2,2,3);imshow(BW2),title('垂直方向20101110227');
subplot(2,2,4);imshow(BW3),title('水平和垂直两个方向20101110227');
- 用canny算子和HOUGH算子对图像进行边缘检测,选择合适的参数,比较分析。
代码:BW = edge(I,'canny');
figure(1),imshow(BW),title('canny算法20101110227');
[H, theta, rho] = hough(BW, 'RhoResolution', 0.5, 'Theta', -90:0.2:89);
peaks=houghpeaks(H,5);
hold on
plot(theta(peaks(:,2)),rho(peaks(:,1)),...
'linestyle','none','marker','s','color','w')
lines=houghlines(BW,theta,rho,peaks);
figure(3),imshow(BW),title('HOUGH算法20101110227'),hold on
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'Linewidth',1,'Color',[1 1 1]);
End
提示:
MATLAB的图像处理工具箱中提供的edge函数可以实现检测边缘的功能,其语法格式如下:
BW = edge(I, ‘sobel’)
BW = edge(I, ‘sobel’, direction)
BW = edge(I, ‘roberts’)
BW = edge(I, ‘log’)
这里BW = edge(I, ‘sobel’)采用Sobel算子进行边缘检测。BW = edge(I, ‘sobel’, direction)可以指定算子方向,即:
direction = ‘horizontal’,为水平方向;
direction = ‘vertical’,为垂直方向;
direction = ‘both’,为水平和垂直两个方向。
注意:将每一步的函数执行语句和实验结果写入实验报告,显示的结果图片请命名,且命名里面包含自己的学号!
六、实验思考
通过学习,我明白了边缘提取其实也是一种滤波,不同的算子有不同的提取效果。比较常用的方法有三种,Sobel算子,Laplacian算子,Canny算子。
Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方法。
Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。
Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉, Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。
例:用三种算子进行边缘检测。
I=imread(‘eight.tif’);
imshow(I)
BW1=edge(I, ‘roberts’);
figure, imshow(BW1), title(‘用Roberts算子’)
BW2=edge(I, ‘sobel’);
figure, imshow(BW2), title(‘用Sobel算子’)
BW3=edge(I, ‘log’);
figure, imshow(BW3), title(‘用拉普拉斯高斯算子’)