一、实验目的

        1. 掌握图像边缘检测的概念及其计算方法;

        2. 熟练使用matlab实现图像的傅里叶变换;

二、实验环境

        1. PC计算机

        2. MatLab软件/语言包括图像处理工具箱(Image Processing Toolbox)

        3. 实验所需要的图片

三、实验原理

        数字图像的边缘检测是在数字图像上,利用算法提取出图像中边缘信息的过程。像素处于不同区域之间的强度变化可以导致出现边缘。在数字图像处理中,边缘是一个对图像中像素强度变化的局部响应,通常定义为函数显著变化的地方。图像中的边缘信息对于提取物体的形状、图像分割和物体识别等任务都非常重要。常用的边缘检测算法有Sobel算子、Prewitt算子、Roberts算子、拉普拉斯算子和Canny算子等。

Roberts算子

Roberts算子是一个交叉算子,其在点(i,j)的梯度幅值表示为:

    

用卷积模板可表示为:

    

其中,Gx和Gy分别为:

    

Sobel算子

Sobel算子在点(i,j)的梯度幅值表示为:

    

简化的卷积模板表示形式为:

    

其中,sx和sy分别x方向和y方向梯度的模版形式:

    

拉普拉斯算子

拉普拉斯变换定义为:

    

离散方式:

    

故二维拉普拉斯数字实现由以上两个分量相加:

    

Canny算子

Canny算子的梯度是用高斯滤波器的导数计算的,检测边缘的方法是寻找图像梯度的局部极大值。

Canny提出了三个边缘检测准则:

(1)最优检测:漏检真实边缘的概率和误检非边缘的概率都尽可能小;

(2)最优定位准则:检测边缘距实际最近或偏离程度最小;

(3)检测点与边缘点一一对应:检边缘与实际一一对应的。

HOUGH变换

        Hough(霍夫)变换的基本思想是将图像空间X-Y变换到参数空间P-Q(也可以叫霍夫空间),利用图像空间X-Y与参数空间P-Q的点-线对偶性,通过利用图像空间X-Y中的边缘数据点去计算参数空间P-Q中的参考点的轨迹,从而将不连续的边缘像素点连接起来,或将边缘像素点连接起来组成封闭边界的区域,从而实现对图像中直线段、圆和椭圆的检测。

        对于任意两点的直线方程:y = ax + b,构造一个关于参数a,b的平面;过xy平面一个点(x1,y1)的所有直线,构成参数ab平面上的一条直线b=-x1a+y1,同理过xy平面点(x2,y2)的所有直线,构成参数ab平面上的另一条直线b=-x2a+y2;如果点(x1,y1)与点(x2,y2)共线,那么这两点在参数ab平面上的直线将有一个交点(a0,b0);xy平面上的任意一条直线y = a0x + b0 ,对应在参数ab平面上都有一个点(a0,b0);

四、实验图像

图片名称:                                               windows.PNG

图片尺寸:                                                 626*478*3

五、实验步骤和结果

1. 读取图像,并显示。

img = imread('windows.PNG');
imshow(img);title('原始图像 学号');

2. 分别用Roberts、Sobel和拉普拉斯高斯算子对图像进行边缘检测。比较三种算子处理的结果。

img = imread('windows.PNG');
img = rgb2gray(img);
% Roberts算子边缘检测
roberts_edge = edge(img, 'Roberts', 'thinning'); 
% Sobel算子边缘检测
sobel_edge = edge(img, 'Sobel', 'both'); 
% 拉普拉斯高斯算子边缘检测
log_edge = edge(img, 'log'); 
% 显示图像
subplot(221);imshow(img);title('原始图像 学号');
subplot(222);imshow(roberts_edge);title('Roberts算子边缘检测');
subplot(223);imshow(sobel_edge);title('Sobel算子边缘检测');
subplot(224);imshow(log_edge);title('拉普拉斯高斯算子边缘检测');

3. 用不同方向(‘水平’、‘垂直’、‘水平和垂直’)的Sobel算子对图像进行边缘检测。比较三种情况的结果。

img = imread('windows.PNG');
img = rgb2gray(img);
% 只检测水平方向的Sobel算子边缘检测
sobel_horizontal = edge(img, 'Sobel', 0.1, 'horizontal'); 
% 只检测垂直方向的Sobel算子边缘检测
sobel_vertical = edge(img, 'Sobel', 0.1, 'vertical'); 
% 同时检测水平和垂直方向的Sobel算子边缘检测
sobel_both = edge(img, 'Sobel', 0.1, 'both'); 
% 显示图像
subplot(221);imshow(img);title('原始图像 学号');
subplot(222);imshow(sobel_horizontal);title('水平方向');
subplot(223);imshow(sobel_vertical);title('垂直方向');
subplot(224);imshow(sobel_both);title('水平和垂直方向');

4. 用canny算子和HOUGH算子对图像进行边缘检测,选择合适的参数,比较分析。

img = imread('windows.PNG');
img = rgb2gray(img);
% 用Canny算子检测出边缘
canny_edge = edge(img, 'Canny', [0.05, 0.10], 1.5); 
% 对边缘进行霍夫变换
[H,T,R] = hough(canny_edge); 
% 找到霍夫变换的峰值点,用于后续直线重构
P = houghpeaks(H,25); 
% 利用霍夫变换的结果提取直线
lines = houghlines(canny_edge,T,R,P,'FillGap',5,'MinLength',10); 
% 显示图像
subplot(121);imshow(canny_edge);title('Canny算子边缘检测 学号'); 
subplot(122);imshow(img), hold on;title('HOUGH算子边缘检测 学号'); 
max_len = 0; % 初始化直线长度为0
for k = 1:length(lines) % 循环遍历每条直线
xy = [lines(k).point1; lines(k).point2]; % 获取直线两端点的坐标信息
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); % 在图像上画出提取出来的直线
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’,为水平和垂直两个方向。

六、实验思考

        通过本次实验,掌握了图像边缘检测的概念及其计算方法,明白了边缘提取其实也是一种滤波,不同的算子有不同的提取效果。对Roberts算子,Sobel算子,拉普拉斯算子,Canny算子有了更深的了解。

        Roberts算子利用局部差分算子寻找边缘,边缘定位精度较高,但容易丢失一部分边缘,同时由于图像没经过平滑处理,因此不具备抑制噪声的能力。该算子对具有陡峭边缘且含噪声少的图像效果较好。

        Sobel算子对图像先做加权平滑处理,然后再做微分运算,对噪声具有一定的抑制能力,但不能完全排除检测结果中出现的虚假边缘,检测出的边缘容易出现多像素宽度。

        拉普拉斯算子一般不以其原始形式用于边缘检测,这是因为:拉普拉斯算子作为一个二阶导数,拉普拉斯算子对噪声具有无法接受的敏感性;拉普拉斯算子的幅值产生双边缘,这是复杂的分割不希望有的结果;拉普拉斯算子不能检测边缘的方向。拉普拉斯算子在分割中所起的作用包括:利用它的零交叉的性质进行边缘定位;确定一个像素是在边缘暗的一边还是亮的一边。

        Canny算子的梯度是用高斯滤波器的导数计算的,检测边缘的方法是寻找图像梯度的局部极大值,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

        例:用三种算子进行边缘检测。

        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(‘用拉普拉斯高斯算子’)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐