Canny边缘检测和MATLAB实现
一、实验目的
本实验的目的是熟悉边缘检测原理,并运用MATLAB软件实现图像的Canny边缘检测,体会Canny边缘检测的优缺点。
二、实验内容
本实验的内容是编写MATLAB程序,实现对Lena图像的边缘检测,输出程序运行结果。
三、实验原理或步骤
边缘检测算法可以分为四个步骤:滤波、增强、检测和定位。Canny边缘检测的算法步骤是:
1. 用高斯滤波器滑腻图像,计算梯度幅值和方向。
2. 对高斯滑腻后的图像进行Sobel边缘检测,得到三个方向的边缘检测图像。
3. 对联合的Sobel检测图像进行非极大值抑制(Non-Maxima Suppression, NMS)。
4. 用双阈值算法检测和连接边缘,并进行滞后阈值处置。
四、运行结果和分析
实验结果表明,Canny边缘检测算法可以有效地检测图像中的边缘,并且具有更好的边缘强度估量,能产生梯度方向和强度两个信息。
五、算法程序
下面是MATLAB实现Canny边缘检测的算法程序:
```matlab
clear all;
close all;
clc;
img = imread('');
imshow(img);
[m n] = size(img);
img = double(img);
% 高斯滤波
w = fspecial('gaussian', [5 5]);
img = imfilter(img, w, 'replicate');
figure;
imshow(uint8(img));
% Sobel边缘检测
w = fspecial('sobel');
img_w = imfilter(img, w, 'replicate');
% 求横边缘
img_h = imfilter(img, w', 'replicate');
% 求竖边缘
img = sqrt(img_w.^2 + img_h.^2);
% 非极大值抑制
new_edge = zeros(m, n);
for i = 2:m-1
for j = 2:n-1
Mx = img_w(i, j);
My = img_h(i, j);
if My ~= 0
o = atan(Mx/My);
elseif My == 0 && Mx > 0
o = pi/2;
else
o = -pi/2;
end
Mx 用 My 和 img 进行插值
adds = get_coords(o);
M1 = My*img(i+adds(2), j+adds(1)) + (Mx-My)*img(i+adds(4), j+adds(3));
adds = get_coords(o+pi);
M2 = My*img(i+adds(2), j+adds(1)) + (Mx-My)*img(i+adds(4), j+adds(3));
isbigger = (Mx*img(i, j) > M1) * (Mx*img(i, j) >= M2) + (Mx*img(i, j) < M1) * (Mx*img(i, j) <= M2);
if isbigger
new_edge(i, j) = img(i, j);
end
end
end
figure;
imshow(uint8(new_edge));
% 滞后阈值处置
up = 120;
low = 100;
set(0, 'RecursionLimit', 10000);
for i = 1:m
for j = 1:n
if new_edge(i, j) > up
new_edge(i, j) = 255;
elseif new_edge(i, j) < low
new_edge(i, j) = 0;
end
end
end
```
这个程序首先对图像进行高斯滤波和Sobel边缘检测,然后进行非极大值抑制和滞后阈值处置,最后输出边缘检测结果。