所有结果均是参考百度文库:http://wenku.baidu.com/link?url=Vyc2wB3Hl_LDtpp7JsVN_-MVGqw6Is1QyTfo2Yrl6jiWoU6G_kJ2I1w8x05qsJIpSCKWXtU_7Z0T2fuQwsc8t585BJr27Ijq2zPPietinjO
首先介绍了几种常见的数字图像边缘检测算法,然后给出检测结果,并给出matlab代码。
Roberts算子:采用对角线方向相邻两像素之差表示信号的突变,检测水平和垂直方向边缘的性能好于斜线方向,定位精度比较高,但对噪声敏感,检测出的边缘较细。
Prewitt算子:对噪声有平滑作用,检测出的边缘比较粗,定位精度低,容易损失角点。
Kirsch算子:Kirsch算子是像素邻域的加权和,模板中心值较大,不但产生较好的边缘效果,而且对噪声具有平滑作用。但存在伪边缘,边缘比较粗且定位精度低。
Laplacian算子:是二阶微分算子,对图像中的阶跃性边缘点定位准确,对噪声非常敏感,丢失一部分边缘的方向信息,造成一些不连续的检测边缘。
LoG算子:首先用高斯函数进行滤波,然后使用Laplacian算子检测边缘,克服了Laplacian算子抗噪声能力比较差的缺点。
Canny算子:采用高斯函数对图像进行平滑处理,因此具有较强的噪声抑制能力;同样该算子也将一些高频边缘平滑掉,造成边缘丢失,采用了双阈值算法检测和连接边缘,边缘的连续性较好。
Sobel算子:产生的边缘效果较好,对噪声具有平滑作用。但存在伪边缘,边缘比较粗且定位精度低。
八方向Sobel算子:可以得到更完整的边缘信息,但是和Sobel算子一样,它们的抗噪声能力都较差,即对于叠加噪声图像的边缘检测效果很不理想。
最佳Sobel算子:在图像进行八方向Sobel算子检测后的梯度图像使用最佳阈值分割图像,解决了八方向Sobel算子抗噪能力差的特点,在去噪的同时有效地保留了图像的真实边缘,即给出了边缘检测的最佳结果。但这种算法对于部分灰度图像的检测结果并不理想,甚至无法检测。至于具体原因还有待进一步的研究。
clc
clear all
close all
A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像
imshow(A);title('原图');
x_mask = [1 0;0 -1]; % 建立X方向的模板
y_mask = rot90(x_mask); % 建立Y方向的模板
I = im2double(A); % 将图像数据转化为双精度
dx = imfilter(I, x_mask); % 计算X方向的梯度分量
dy = imfilter(I, y_mask); % 计算Y方向的梯度分量
grad = sqrt(dx.*dx + dy.*dy); % 计算梯度
grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像
level = graythresh(grad); % 计算灰度阈值
BW = im2bw(grad,level); % 用阈值分割梯度图像
figure, imshow(BW); % 显示分割后的图像即边缘图像
title('Roberts')
clc
clear all
close all
A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像
imshow(A);title('原图');
y_mask = [-1 -1 -1;0 0 0;1 1 1]; % 建立Y方向的模板
x_mask = y_mask'; % 建立X方向的模板
I = im2double(A); % 将图像数据转化为双精度
dx = imfilter(I, x_mask); % 计算X方向的梯度分量
dy = imfilter(I, y_mask); % 计算Y方向的梯度分量
grad = sqrt(dx.*dx + dy.*dy); % 计算梯度
grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像
level = graythresh(grad); % 计算灰度阈值
BW = im2bw(grad,level); % 用阈值分割梯度图像
figure, imshow(BW); % 显示分割后的图像即边缘图像
title('Prewitt')
clc
clear all
close all
A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像
imshow(A);title('原图');
mask1=[-3,-3,-3;-3,0,5;-3,5,5]; % 建立方向模板
mask2=[-3,-3,5;-3,0,5;-3,-3,5];
mask3=[-3,5,5;-3,0,5;-3,-3,-3];
mask4=[-3,-3,-3;-3,0,-3;5,5,5];
mask5=[5,5,5;-3,0,-3;-3,-3,-3];
mask6=[-3,-3,-3;5,0,-3;5,5,-3];
mask7=[5,-3,-3;5,0,-3;5,-3,-3];
mask8=[5,5,-3;5,0,-3;-3,-3,-3];
I = im2double(A); % 将数据图像转化为双精度
d1 = imfilter(I, mask1); % 计算8个领域的灰度变化
d2 = imfilter(I, mask2);
d3 = imfilter(I, mask3);
d4 = imfilter(I, mask4);
d5 = imfilter(I, mask5);
d6 = imfilter(I, mask6);
d7 = imfilter(I, mask7);
d8 = imfilter(I, mask8);
dd = max(abs(d1),abs(d2)); % 取差值变化最大的元素组成灰度变化矩阵
dd = max(dd,abs(d3));
dd = max(dd,abs(d4));
dd = max(dd,abs(d5));
dd = max(dd,abs(d6));
dd = max(dd,abs(d7));
dd = max(dd,abs(d8));
grad = mat2gray(dd); % 将灰度变化矩阵转化为灰度图像
level = graythresh(grad); % 计算灰度阈值
BW = im2bw(grad,level); % 用阈值分割梯度图像
figure, imshow(BW); % 显示分割后的图像,即边缘图像
title('Kirsch')
clc
clear all
close all
A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像
imshow(A);title('原图');
mask=[0,-1,0;-1,4,-1;0,-1,0]; % 建立模板
I = im2double(A); % 将数据图像转化为双精度
dx = imfilter(I, mask); % 计算梯度矩阵
grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像
BW = im2bw(grad,0.58); % 用阈值分割梯度图像
figure, imshow(BW); % 显示分割后的图像,即梯度图像
title('Laplacian')
clc
clear all
close all
A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像
imshow(A);title('原图');
mask=[0,0,-1,0,0;0,-1,-2,-1,0;-1,-2,16,-2,-1;0,-1,-2,-1,0;0,0,-1,0,0]; % 建立模板
I = im2double(A); % 将数据图像转化为双精度
dx = imfilter(I, mask); % 计算梯度矩阵
grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像
BW = im2bw(grad,0.58); % 用阈值分割梯度图像
figure, imshow(BW); % 显示分割后的图像,即梯度图像
title('log')
clc
clear all
close all
A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像
imshow(A);title('原图');
y_mask = [-1 -2 -1;0 0 0;1 2 1]; % 建立Y方向的模板
x_mask = y_mask'; % 建立X方向的模板
I = im2double(A); % 将图像数据转化为双精度
dx = imfilter(I, x_mask); % 计算X方向的梯度分量
dy = imfilter(I, y_mask); % 计算Y方向的梯度分量
grad = sqrt(dx.*dx + dy.*dy); % 计算梯度
grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像
level = graythresh(grad); % 计算灰度阈值
BW = im2bw(grad,level); % 用阈值分割梯度图像
figure, imshow(BW); % 显示分割后的图像即边缘图像
title('Sobel')