图7.8点模板应用示例
(a)初始灰度级分布 (b)点模板中间计算结果 (c)点模板匹配输出
图7.9 匹配滤波器线模板
利用线模板对图像作线检测的过程为:对某一给定的窗口,分别计算模板W1、W2、W3、W4的匹配输出g l (m,n),l =1,2,3,4,窗口输出为
g?m,n??max?gl(m,n)? (7.1.13)
lli,j其中 g?m,n??
???i??lj??lf?m?i,n?j? (7.1.14)
图7.10初始图像灰度分布
式中ωi,j是线模板系数,对3×3窗口,i,j=-1,0,1。图7.10(a),(b),(c)为初始图像灰度分布,分别表示垂直、倾斜、水平三种线型图像结构(线框内)。图7.9中的线模板作匹配检测,其结果如图7.11(a) ,(b) ,(c)所示,可见线结构获得明显加强。
1 4 1 1 1 4 1 0 1 0 6 0 1 6 1 4 6 4 1 4 1 4 1 1 1 0 1
(a) (b) (c)
图7.11线模板示例
(3)边缘模板
边缘与区域间变化相对应。提取边缘经常采用的方法之一是使用某种形式的算子,如上面介绍的基于3×3样本的Laplacian算子和基于2×2样本的梯度。现在,将梯度的概念扩展到3×3子集,便可得到简便的Sobel梯度模板(如图7.12所示)。
-1 0 1 1 2 1 -2 0 2 0 0 0 -1 0 1 -1 -2 -1
(a) (b)
图7. 12 Sobel梯度模板
( a ) j方向模板(h'i,j) (b) k方向模板(h2i,j)
由此可得
Gj?[f?m?1,n?1??2f?m,n?1??f?m?1,n?1?]?[f?m?1,n?1??2f?m,n?1??f?m?1,n?1?ll (7.1.15)
???i??lj??lhi,jf?m?i,n?j?1Gk?[f?m?1,n?1??2f?m?1,n??f?m?1,n?1?]?[f?m?1,n?1??2f?m?1,n??f?m?1,n?1?ll (7.1.16)
???i??lj??lhi,jf?m?i,n?j?2即像点f(m,n)处的边缘提取输出为
22?g?m,n???G?Gk??j或g?m,n??Gj?Gk或g?m,n??maxGj,Gk??
(7.1.17)
由此可见,Gj为第1列和第3列的差;Gk为第1行和第3行的差;像点f(m,n)的4邻点((f(m ,n+1)、f(m,n-1)、f(m-1,n)、f(m +1,n))位置上的权重等于角隅上像点的2倍。当Gj>Gk时,在f(m,n)处的垂直方向的边缘通过;反之,则由水平方向的边缘通过。
7.1.3曲面拟合法
曲面似合法的边缘检测基本思路是用一个面或曲面去逼近一个图像面积元,然后用这个平面或曲面的梯度代替点的梯度,从而实现边缘检测。此方法在完成边缘检测的同时,能够较好地抑制噪声的干扰。下面介绍两种常用的曲面拟合法。
(1)一次平面拟合
假设图像面积元由f(m,n+1)、f(m+l,n+1)、f(m,n)、f(m+l,n)4个相邻像素组成,若用一次平面ax+by+c去拟合该面积元△s上4个相邻像素,则有
g(x,y)=ax+by+c (7.1.18)
若用此去逼近f(x,y),则两者之间存在均方误差为
???x,y?s??g?m,n??f?m,n????222??am?bn?c?f?m,n??????a?m?1??bn?c?f?m?1,n??????am?b?n?1??c?f?m,n?1??????a?m?1??b?n?1??c?f?m?1,n?1???22
(7.1.19)
为达到最佳吻合,应使均方误差最小,即上式对a,b,c分别求导并令其等于零,由此可求得
a?f?m?1,n??f?m?1,n?1?2f?m,n?1??f?m?1,n?1?2?f?m,n??f?m,n?1?2f?m,n??f?m?1,n?2 (7.1.21) (7.1.20)
b??c???3f?m,n??f?m?1,n??f?m,n?1??f?m?1,n?1??ma?nb?? (7.1.22)
41根据梯度定义,平面ax+by+c上的梯度幅度为
11???g?2??g??2222G?gx,y???a?b??????? (7.1.23) ???????x????y?????2即为
G??g?x,y????a?bG??g?x,y????max?a,b? (7.1.24)
由此可知:a是两列的平均值的差分;b是两行的平均值的差分。由于差分是建立在平滑基础
上,故对噪声就不像直接使用微分算子那样敏感。因为这个平面是对已知2×2邻域内的图像灰度级的最好近似,故可合理地把平面的梯度看作是该邻域的中心(m+1/2,n+1/2)点处图像 梯度的近似值。
(2)二次平面拟合
设检测像素所在面积元(如图7.13)为:
?s?{f?m?1,n?1?,f?m,n?1?,f?m?1,n?1?,f?m?1,n?,f?m,n?,f?m?1,n?,f?m?1,n?1?,f?m,n?1?,f?m?1,n?1?} (7.1.25)
如同一次曲面拟合那样,用二次曲面:g(x,y)=ax2+bxy+cy2+dx+ey+g拟合面积元△s,由此产
生均方误差为
???x,y?s??ax?bxy?cy?dx?ey?g??f?x,y???? (7.1.26)
222同样,若使均方误差最小,即ε分别对a,b,c,d,e,g求偏导,并令其分别为零,即有
???a?0???b?0???c?0???d?0???e?0???g?0 (7.1.27)
1???g?2??g?2?2?? 求得曲面梯度幅度。由此可求a,b,c,d,e,g。然后再根据G? ????g?x,y???????x?y????????f(m-1,n-1) f(m-1,n) f(m-1,n+1) f(m,n-1) f(m,n) f(m,n+1) f(m+1,n-1) f(m+1,n) f(m+1,n+1)
图7.13 9点面积元示意图
7.1.4 边缘检测的MATLAB实现方法
(1) MATLAB提供的用于灰度图像边缘的函数
在MATLAB中edge函数用于灰度图像边缘的提取,他支持6种不同的边缘提取方法,即Sobel方法、Prewitt方法、Roberts方法、Laplacian-Gaussian方法、过零点方法和Canny方法,其语法结构如下:
BW=edge(I, 'sobel')——指定Sobel边缘提取方法;
BW =edge( I, 'sobel', thresh)——指定具有阈值thresh的Sobel方法,即强度小于阈值的边缘被省略掉了,缺省时自动选取阈值。
BW=edge(I ,' sobel' , thresh, direction)——指定具有方向性的Sobel方法,为‘horizontal'(水平方向)或‘vertical'(垂直方向)或‘both'(两个方向),缺省时为‘both' ;
[BW,thresh]=edge(I, 'sobel' , - - - )——返回Sobel方法的阈值。 下面的调用与Sobel方法类似: BW=edge(I, 'prewitt')
BW=edge(I,'prewitt',thresh)
BW=edge(I,’prewitt',thresh,direction) [BW,thresh]=edge(I,'prewitt',?) BW=edge(I,'roberts')
BW=edge(I,'roberts',thresh) [BW,thresh]]=edge(I,'roberts',?) BW=edge(I,'log')
BW=edge(I,'log',thresh)
BW=edge(1,'log', thresh, sigma)——sigma是Laplacian-Gaussian函数的标准偏差 [BW,threshold]=edge{I,'log',?}
BW = edge (1,'zerocross',thresh,h)——h是用户指定的滤波函数 [BW,thresh]=edge(I,'zerocross',?) BW=edge(I,’canny')
BW=edge(I,'canny',thresh)
BW=edge(I,'canny',thresh,direction) [BW,threshold]=edge (I,'canny',?)
其中I为灰度图像,BW为黑白二值边缘图像。 (2)边缘检测的MATLAB实现方法
下面给出的是针对同一种图像的Sobel和Canny两种边缘检测器的不同效果的程序清单: I=imread('rice.tif'); BW1=edge(I,'sobel'); BW2=edge(I,'canny'); figure(1),imshow(I); figure(2),imshow(BW1); figure(3),imshow(BW2);
I=imread('rice.png'); BW1=edge(I,'sobel'); BW2=edge(I,'canny'); figure(1),imshow(I); figure(2),imshow(BW1); figure(3),imshow(BW2);
下面给出的是用“prewitt\”算法对图像rice.tif进行边缘检测程序清单: I=imread('rice.tif'); BW1=edge(I,'prewitt'); BW2=edge(I,'log');
subplot(2,2,1),imshow(I),title('原图');
subplot(2,2,2),imshow(BW1),title('prewitt算法'); subplot(2,2,3),imshow(BW2),title('log算法');
I=imread('rice.png'); BW1=edge(I,'prewitt'); BW2=edge(I,'log');
subplot(2,2,1),imshow(I),title('原图');
subplot(2,2,2),imshow(BW1),title('prewitt算法'); subplot(2,2,3),imshow(BW2),title('log算法');
7.2 灰度阂值分割法
在灰度图像中分离出有意义区域的最基本的方法是设置阈值的分割方法。
若图像中存在背景S0和n个不同意义的部分S1,S2,?,Sn(见图7. 16),或者说该图像有(n+1)个区域组成,各个区域内的灰度值相近,而各区域之间的灰度特性有明显差异,并设背景的灰度值最小,则可在各区域的灰度差异设置n个阈值T0,T1,?,Tn-1(T0 图7.16 图像中的区域(n=4) ?g0?g?1?g?i,j?????g?n?1??gnf?i,j??T0T0?f?i,j??T1?Tn?2?f?i,j??Tn?1f?i,j??Tn?1 (7.2.1) 式中,f(i,j)为原图像像素的灰度值;g(i,j)为区域分割处理后图像上像素的输出结果;g0,g1, g2,?,gn分别为处理后背景S0,区域S1,,区域S2,?,区域Sn中像素的输出值或某种标记。图像各点经以上灰度阈值法处理后,各个有意义区域就从图像背景中分离出来。 在简单图像中常常只出现背景和一个有意义部分两个区域(如图7.17(a)),这时只需要设置一个阈值,就能完成分割处理,并形成仅有两种灰度值的二值图像。有时,同一类型的有意义区域在图像中重复出现多个(如图7.17(b)),它们的灰度特性相同,属于同一种景物,此时,一种区域由多个子区域组成。 图像中区域的范围常常是模糊的,因此如何选取阈值便成为区域分割处理中的关键问题。 (e)(f) 图7.17简单图像中的区域和双峰法阂值分割 (a) 两区域图像 (b)有子区域的两区域图像 (c)图(a)的直方图 (d)图(b)的直方图 (e) T0为160时图(a)的区域分割结果 (f) T0为110时图(b)的区域分割结果 7.2.1 双峰法 在一些简单图像中,对象物的灰度分布较有规律,背景和各个对象物在图像的灰度直方图上各自形成一个波峰,即区域和波峰一一对应。由于每个波峰间形成一个低谷,因而选择双峰间低谷处所对应的灰度值为阈值,可将两个区域分离。依此类推,可在图像背景中分离出各类有意义的区域。图7.17(c),图7.17(d)为两个区域的简单图像的灰度直方图,当分别取