logo资料库

matlab 边缘检测算子代码.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
一 实验原理
Sobel的原理:
Canny的原理:
Prewitt算子:
Roberts算子:
Laplacian算子:
二 实验过程:
三 实验结果
一 实验原理 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 算子:是二阶微分算子,对图像中的阶跃性边缘点定位准确,线 条细腻。但对噪声非常敏感,丢失一部分边缘的方向信息,造成一些不连续的 检测边缘。
分享到:
收藏