一 实验原理
Sobel 的原理:
索贝尔算子(Sobel operator)是图像处理中的算子之一,主要用作边缘检测。在技术上,
它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此
算子,将会产生对应的梯度矢量或是其法矢量。
Canny 的原理:
1、图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘位置。
2、根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是 Canny 边缘检测算子。
3、类似与 Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。
Canny 边缘检测算法
step1:用高斯滤波器平滑图象;
step2:用一阶偏导的有限差分来计算梯度的幅值和方向;
step3:对梯度幅值进行非极大值抑制
step4:用双阈值算法检测和连接边缘
Canny 算子使用了变分法,这是一种寻找满足特定功能的函数的方法。最
优检测使用四个指数函数项的和表示,但是它非常近似于高斯函数的一阶导数。
Canny 的目标是找到一个最优的边缘检测算法。
Prewitt 算子:
Prewitt 算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻
点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有
平滑作用。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来
完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
Roberts 算子:
Roberts 算子是一种利用局部差分算子寻找边缘的算子,对于边界陡峭且噪比
较小的图像检测效果比较好,它在 2×2 邻域上计算对角导数,
j
G[i,j]又称为 Roberts 交叉算子。
G i
=
i
,
,
j
f
f
i
1,
j
2
1
f
i
1,
j
f
i
,
j
2
1
Laplacian 算子:
Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度
的散度。函数f(x,y)的拉普拉斯算子公式为:
2
f
f
2
2
x
f
2
2
y
二 实验过程:
利用上述原理实现对红外截图中人物的检测及识别。
Sobel 算子实现程序:
A = imread('cameraman.tif'); % 读入图像
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');
Canny 算子实现程序:
I = imread('cameraman.tif'); % 读入图像
imshow(I);title('原图')
BW1 = edge(I,'canny'); % 调用canny函数
figure,imshow(BW1); % 显示分割后的图像,即梯度图像
title('Canny')
Prewitt 算子实现程序:
A = imread('cameraman.tif'); % 读入图像
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')
Roberts 算子实现程序:
A = imread('cameraman.tif'); % 读入图像
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')
Laplacian 算子实现程序:
A = imread('cameraman.tif'); % 读入图像
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')
三 实验结果
Sobel 算子对噪声具有平滑作用,能提供较为精确的边缘方向信息,但边缘
定位精度不够高,边缘线条较粗。当对精度要求不是很高的时候,是一种较为
常用的边缘检测的方法。
canny 算子提取的边缘线性连接程度较好,对此类的边缘提取的比较完整,
边缘线很细腻。对比度不明显的后景也会提取出来。
Prewitt 跟 Sobel 一样具有一定的噪声抑制能力,在检测阶跃边缘时得到的边缘
宽度至少为二像素,导致提取到的边缘线条较粗。
Roberts 采用对角线方向相邻两像素之差表示信号的突变,检测水平和垂直
方向边缘的性能好于斜线方向,定位精度较高,检测出的边缘较细,但对噪声
敏感。
Laplacian 算子:是二阶微分算子,对图像中的阶跃性边缘点定位准确,线
条细腻。但对噪声非常敏感,丢失一部分边缘的方向信息,造成一些不连续的
检测边缘。