边界对图像来说是至关重要的信息,人可以仅通过图像边缘、轮廓就能对图像整体产生较完整的认识,例如漫画、简笔画等待。基于边界的图像分割技术是基于灰度不连续性进行的分割方法,其基础就是边缘检测
利用梯度、差分、拉普拉斯算子及高通滤波等处理方法进行图像锐化,增强图像边缘,再进行一次阈值化处理,便可以将边缘增强的方法用于边缘检测
∇ f = [ G x G y ] = [ ∂ F ∂ x ∂ F ∂ y ] \nabla f=\begin{bmatrix} G_x \\ G_y \\ \end{bmatrix}=\begin{bmatrix} \frac{\partial F}{\partial x} \\ \\ \frac{\partial F}{\partial y} \\ \end{bmatrix} ∇f=[GxGy]=⎣⎡∂x∂F∂y∂F⎦⎤
[ 1 0 0 − 1 ] [ 0 1 − 1 0 ] \begin{bmatrix} 1 & 0 \\ 0 & -1 \\ \end{bmatrix}\begin{bmatrix} 0 & 1 \\ -1 & 0 \\ \end{bmatrix} [100−1][0−110]
[ − 1 0 1 − 1 0 1 − 1 0 1 ] [ 1 1 1 0 0 0 − 1 − 1 − 1 ] \begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ -1 & -1 & -1 \\ \end{bmatrix} ⎣⎡−1−1−1000111⎦⎤⎣⎡10−110−110−1⎦⎤
[ − 1 0 1 − 2 0 2 − 1 0 1 ] [ 1 2 1 0 0 0 − 1 − 2 − 1 ] \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \\ \end{bmatrix} ⎣⎡−1−2−1000121⎦⎤⎣⎡10−120−210−1⎦⎤
由于噪声的原因,边界的特征很少能够被完整地描述,在亮度不一致的地方会中断。典型的边缘检测算法后面总要跟随着连接过程和其他边界检测过程,用来规整边界像素,成为有意义的边界。
简单来说大概有两类方法:
对做过边缘检测的图像的每个点 ( x , y ) (x,y) (x,y)的特性在一个小的邻域中进行分析,所有相似的点被连接形成一个享有共同特性像素的边界。
所分析的特性一般是像素之间梯度算子的响应强度和梯度方向
若梯度强度和梯度方向都小于所设置的阈值,则可以说像素 ( x , y ) (x,y) (x,y)和 ( x ′ , y ′ ) (x',y') (x′,y′)是连接的
将检测的边缘点连接成线,形成有意义的边界。
采用电视光栅行扫描顺序,结合阈值检测,对遇到的像素进行分析从而确定是否为边缘的跟踪方法,具体步骤如下:
(1) 选取一个较大的检测阈值 d d d,对图像第一行进行阈值化。大于 d d d的像素作为对象点,并作为下一步跟踪的起始点
(2) 选取一个较小的跟踪阈值 k k k,例如灰度差阈值
(3) 扫描下一行像素(像素 ( i , j ) (i,j) (i,j)的下一行像素 ( i + 1 , j − 1 ) (i+1,j-1) (i+1,j−1)、 ( i + 1 , j ) (i+1,j) (i+1,j)、 ( i + 1 , j + 1 ) (i+1,j+1) (i+1,j+1)为跟踪邻域),凡与上一行对象点相邻接的像素灰度差小于 k k k的且值最小的点接受为新对象点,反之去除
(4) 对未被接受为对象点的其他各行像素再次从步骤(1)开始重复
全向跟踪是指跟踪方向可以是任意方向,并且有足够大的跟踪距离的跟踪方法。是一种改变了邻域定义和跟踪准则的光栅跟踪法,其跟踪步骤和原则与光栅跟踪法一致
(1) 邻域:选取适当的、能进行全向跟踪的邻域,例如八邻域等
(2) 跟踪准则:选择一个适当的跟踪准则,如灰度阈值、对比度和空间距离等
在找出边界点集之后,需要连接形成完整有意义的边界图像描述。在预先知道区域形状的条件下,利用Hough变换不仅可以方便地得到边界曲线将不连续的像素点连接起来,而且可以用数学公式来表达该直线,性能优异。
对于边界上 n n n个点的点集,找出其满足形状的点集和曲线方程
这里介绍一下利用Hough变换检测直线边界的例子:
已知任意两点的直线方程 y = a x + b y=ax+b y=ax+b有一个未知数平面 x y xy xy和一个参数平面 a b ab ab,且在未知数平面上任一条直线 y = a x + b y=ax+b y=ax+b都在参数平面上对应着一个点。
那么可得,过未知数平面一个点 ( x , y ) (x,y) (x,y)的所有直线,构成参数平面上的一条直线 b = − a x + y b=-ax+y b=−ax+y显然这是一条参数平面上的直线方程
若有两点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)、 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)且这两点在未知数平面上共线,那么这两点在参数平面上的直线将会交于 ( a , b ) (a,b) (a,b)点 { y 1 = a x 1 + b y 2 = a x 2 + b → { b = − a x 1 + y 1 b = − a x 2 + y 2 \begin{cases} y_1=ax_1+b \\ y_2=ax_2+b \\ \end{cases} \to\begin{cases} b=-ax_1+y_1 \\ b=-ax_2+y_2 \\ \end{cases} { y1=ax1+by2=ax2+b→{ b=−ax1+y1b=−ax2+y2据此可以推断,在未知数平面上共线的点最终都会交于参数平面上的 ( a , b ) (a,b) (a,b)点,因此若在参数平面上有多条直线相交于某一个点,则该点的坐标 ( a , b ) (a,b) (a,b)可以作为未知数平面上直线方程的参数,这样就检测出了这条直线边界。