数字图像处理-第十章
(3)实现代码
imread('10.3.jpg');
f = imread('10.3.jpg'); imshow(f); f=rgb2gray(f); ec=edge(f,'canny',0.1); imshow(ec); ec=edge(f,'canny',0.2); imshow(ec);
边缘检测 彩色图像转 换成灰度图
-1 -1 -1 -1 8 -1 -1 -1 -1
R w i z i ,
i 1 i 9
-1 -2 -1 -2 12 -2 -1 -2 -1
R T
(2)实例1
(2)实例2
(3)实现代码
w=[-1,-1,-1;-1,8,-1;-1,-1,-1];
f=imread('lyf.jpg'); g=abs(imfilter(double(f), w)); T=0.9*max(g(:)); g1=g.*(g>=T);
T=0.2*max(g(:))
T=0.3*max(g(:))
T=0.4*max(g(:))
T=0.5*max(g(:))
10.1.3 使用edge函数的边缘检测 基础:两种边缘模型
边缘的一阶导数和二阶导数
特点 1、一阶导数:在斜坡上,导数值 为正,在平坦区为零。
2、二阶导数:在跃变点,一正一
负,其他部分为零。(过零点)
B、其它各种形式的梯度模板(弥补梯度算子模板的不足)
Z1 Z4
Z7
Z2 Z5
Z8
Z3 Z6
Z9
Roberts边缘检测
Z1 Z4 Z7
Z2 Z5 Z8
Z3 Z6 Z9
图像领域块
用Roberts算子进行边缘检测的结果
Prewitt边缘检测
Z1 Z4 Z7 Z2 Z5 Z8 Z3 Z6 Z9
图像领域块
T=0.9*max(g(:))
uint8(double(g)/max(g(:))*255);
(3)实现代码
w=[2,-1,-1;-1,2,-1;-1,-1,2];
f = imread('10.2.jpg'); f = rgb2gray(f); g=abs(imfilter(double(f),w)); T=0.5*max(g(:)); g1=g.*(g>=T);
(4) 对梯度取两次阈值得到两个阈值T1和T2,如: T1=0.4×T2 我们把梯度值小于T1的像素的灰度设为0,得到图像1, 然后把梯度值小于T2的像素的灰度设为0,得到图像2. 由于图像2的阈值较高,去除了大部分噪声,但同时也损 失了有用的边缘信息。 而图像1的阈值低,保留了较多的信息。以图2为基础,根 据图像1来补充连接图像的边缘。
edge(f,'log',0.003)
edge(f,‘prewitt',0.04)
edge(f,‘sobel',0.0547)
结果对比:调至最佳系数
(4)边缘检测的MATLAB实现 ☺语法:[g,t]=edge(f, ‘method’, parameter) 说明: ☺ g是一个逻辑数组,其值为:在f中检测到边缘的位置为1,其 他位置为零; ☺ t是edge是用的阈值; ☺ method为边缘监测器方法,可选为: ‘sobel’, ‘prewit’, ‘roberts’, ‘log’(LoG), ‘zerocoss’, ‘canny’等 ☺ parameter包含两部分:T为指定的阈值,第二部分为dir(检 测边缘的首选方向: ‘horizontal’, ‘vertical’, ‘both’),或 sigma(标准方差),或H(指定的滤波函数)。
2 2 2
f f (x 1, y ) f (x 1, y ) 2f (x , y ) 2 x
2
f f (x 1, y ) f (x 1, y ) f (x , y 1) f (x , y 1) 4f (x , y )
2
2f f (x , y 1) f (x , y 1) 2f (x , y ) 2 y
(x 0 , y 0 )是(x , y )邻域中的点
梯度相位相近
( 2 ) canny边缘检测的边缘点连接法: 参看canny边缘检测算法中的边缘点连接法。
10.2 Line Detection Using the Hough Transform
实际上,由于噪声、光照不均匀引起的边缘断开和其 它造成灰度的伪不连续性的因素影响,最终像素不能完 全的表征为边缘(In practice, the resulting pixels seldom characterize an edge completely because of noise,breaks in the edge from nonuniform illumination,and other effects that introduce spurious intensity discontinuities.)
-1
-1 -1
2 -1
2 2 -1 -1
模板处理, 得到模板响 应图像
imshow(g1);
gg=uint8(double(g)/max(g(:))*255); imshow(gg);
归一化到0255的灰度图
uint8(double(g)/max(g(:))*255);
T=0.1*max(g(:))
噪声对一阶导数和二阶导数的影响
噪声对一阶和二阶 导数都有影响,尤其对 二阶导数影响较大,因 此,在检测边缘前应该 考虑平滑处理。
梯度算子: A、梯度算子
原理:在灰度变化缓慢或灰度不变的区域,梯 度的幅值较小或为零。灰度突变的地方幅值较大。
不足:只体现在x方向和y方向,域太小(4像素)
f (i 1, j ) f (i , j ) 0 0 f (i , j 1) f (i , j ) 1 1 f f 2 2 2 2 2 2 mag (f ) G G ( ) ( ) G y x x y G x G y f (i 1, j ) f (i , j ) f (i , j 1) f (i , j )
低误判率,即尽可能少地把边缘点误认为是非边 缘点; 高定位精度,即准确地把边缘点定位在灰度变化 最大的像素上;
抑制虚假边缘。 该算法的边缘连接十分完整
Canny边缘检测是一种比较新的边缘检测算子,具有很好 边缘检测性能,得到了越来越广泛的应用。它能在噪声抑制和 边缘检测之间取得较好的平衡。具体步骤如下: (1)用高斯滤波器来对图像滤波,可以去除图像中的噪声。 (2)用高斯算子的一阶微分对图像进行滤波,得到每个像素 梯度的大小|G|和方向
以下是水平、垂直、45及-45度线的线检测模板:
(2)实例
原图
T=0.1*max(g(:))
T=0.2*max(g(:))
T=0.3*max(g(:))
T=0.4*max(g(:))
T=0.5*max(g(:))
(2)实例
T=0.6*max(g(:))
T=0.7*max(g(:))
T=0.8*max(g(:))
用Prewitt算子进行边缘检测的结果
用Prewitt算子进行边缘检测的结果
Sobel边缘检测
Z1 Z4
Z2 Z5
Z3 Z6
Z7
Z8
Z9
图像领域块
用以下模板实现Sobel算子
用Sobel算子进行边缘检测的结果
用Sobel算子进行边缘检测的结果
(3)拉普拉斯算子
f f f 2 2 x y
ec=edge(f,'canny',0.2);
ec=edge(f,'canny',0.3);
用canny检测算子进行边缘检测的结果
Original image
ec=edge(f,'canny',0.1);
ec=edge(f,'canny',0.2);
ec=edge(f,'canny',0.3);
用canny检测算子进行边缘检测的结果
10.1 间断检测
在本节中,将讨论在数字图像中检测亮度不连续 的三种基本类型: 点、线和边缘 方法:采用掩模法,即模板处理。如3×3模板
R w i z i ,
i 1
中心像素 处模板的 响应 图像 的像 素值
i 9
模板 系数
10.1.1 点检测
点检测原理 当掩模的中心位于一个孤立点时,掩模的响应最强,而 在亮度不变的区域,响应为零,亮度变化缓慢的区域响应较 小。 即用空间域的高通滤波器来检测孤立点:
ec=edge(f,'canny',0.4);
ec=edge(f,'canny',0.5);
ec=edge(f,'canny',0.6);
ec=edge(f,'canny',0.7);
用canny检测算子进行边缘检测的结果
Original image
edge(f,'canny',0.2);
edge(f,'roberts',0.05)
2
-1 -1
-1 -1
2 -1 -1 2
模板处理, 得到模板响 应图像
imshow(g1);
gg=uint8(double(g)/max(g(:))*255); imshow(gg);
归一化到0255的灰度图
(3)实现代码
w=[-1,-1,-1; 2,2,2;-1,-1,-1];
f = imread('10.2.jpg'); f = rgb2gray(f); g=abs(imfilter(double(f),w)); T=0.5*max(g(:)); g1=g.*(g>=T);