一、基本概念及原理
1. 边缘检测
边缘检测的概念及原理在第四次作业就已经介绍并使用过。这里选取Sobel算法、Laplacian算法和Canny算法再进行简单的介绍。
- Sobel算法:
通过Sobel算子与原图像卷积即可。通过这样的操作可以得到图像的边缘,且这种方法得到的边缘往往较为粗大。Sobel算子用于得到图像的梯度信息,则这样处理后梯度较大的位置更亮,而梯度较大的位置往往是图像的边缘位置,故而通过这种方法可以实现图像的边缘检测和提取。
Sobel算子可以得到图像的梯度信息,分为两个部分:
x方向Sobel算子: [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \begin{bmatrix}1&0&-1\\2&0&-2\\1&0&-1\end{bmatrix} ⎣⎡121000−1−2−1⎦⎤
y方向Sobel算子: [ 1 2 1 0 0 0 − 1 − 2 − 1 ] \begin{bmatrix}1&2&1\\0&0&0\\-1&-2&-1\end{bmatrix} ⎣⎡10−120−210−1⎦⎤
将它们分别与图像卷积得到x,y方向上的梯度矩阵:
G
x
=
[
1
0
−
1
2
0
−
2
1
0
−
1
]
∗
A
G
y
=
[
1
2
1
0
0
0
−
1
−
2
−
1
]
∗
A
\begin{aligned} G_x=\begin{bmatrix}1&0&-1\\2&0&-2\\1&0&-1\end{bmatrix}*A &&&&&& G_y=\begin{bmatrix}1&2&1\\0&0&0\\-1&-2&-1\end{bmatrix}*A \end{aligned}
Gx=⎣⎡121000−1−2−1⎦⎤∗AGy=⎣⎡10−120−210−1⎦⎤∗A
综合两个方向后有: G = G x 2 + G y 2 G=\sqrt{G_x^2+G_y^2} G=Gx2+Gy2
常将上式简化为: ∣ G ∣ = ∣ G x ∣ + ∣ G y ∣ |G|=|G_x|+|G_y| ∣G∣=∣Gx∣+∣Gy∣
故而梯度方向矩阵也就容易求出了: Θ = a r c t a n ( G y G x ) \Theta=arctan\left(\frac{G_y}{G_x}\right) Θ=arctan(GxGy)
- Laplacian算法:
一般来说,图像的边缘轮廓不仅具有较高的梯度,也具有较高的二阶导数。对一个二维函数求二阶导的变换就是Laplacian变换,所以我们容易想到通过构造一个Laplace算子来实现图像的边缘检测,即Laplacian边缘检测。
下面给出Laplace算子的推导过程:
对于一个二维函数,其Laplacian变换为:
f ( x , y ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 f(x,y)=\frac{\partial^2f}{\partial{x^2}}+\frac{\partial^2f}{\partial{y^2}} f(x,y)=∂x2∂2f+∂y2∂2f
其中
∂ 2 f ∂ x 2 = ∂ ∂ x [ f ( x + △ x 1 , y ) − f ( x , y ) ] △ x 1 2 = ∂ ∂ x [ f ( x + 1 , y ) − f ( x , y ) ] = [ f ( x + 1 + △ x 2 , y ) − f ( x + △ x 2 , y ) ] − [ f ( x + 1 , y ) − f ( x , y ) ] △ x 2 = f ( x , y ) − f ( x − 1 , y ) − f ( x + 1 , y ) + f ( x , y ) − 1 = f ( x + 1 , y ) + f ( x − 1 , y ) − 2 f ( x , y ) \begin{aligned} \frac{\partial^2f}{\partial{x^2}} &=\frac{\partial}{\partial{x}}\frac{[f(x+\triangle{x_1},y)-f(x,y)]}{\triangle{x_1^2}} \\ &=\frac{\partial}{\partial{x}}[f(x+1,y)-f(x,y)] \\ &=\frac{[f(x+1+\triangle{x_2},y)-f(x+\triangle{x_2},y)]-[f(x+1,y)-f(x,y)]}{\triangle{x_2}} \\ &=\frac{f(x,y)-f(x-1,y)-f(x+1,y)+f(x,y)}{-1} \\ &=f(x+1,y)+f(x-1,y)-2f(x,y) \end{aligned} ∂x2∂2f=∂x∂△x12[f(x+△x1,y)−f(x,y)]=∂x∂[f(x+1,y)−f(x,y)]=△x2[f(x+1+△x2,y)−f(x+△x2,y)]−[f(x+1,y)−f(x,y)]=−1f(x,y)−f(x−1,y)−f(x+1,y)+f(x,y)=f(x+1,y)+f(x−1,y)−2f(x,y)
因为数字图像都是离散值,故 △ x 1 \triangle{x_1} △x1和 △ x 2 \triangle{x_2} △x2分别取 1 和 -1 (实际上就是二阶差分)
同理,
∂
2
f
∂
y
2
=
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
x
,
y
)
\frac{\partial^2f}{\partial{y^2}}=f(x,y+1)+f(x,y-1)-2f(x,y)
∂y2∂2f=f(x,y+1)+f(x,y−1)−2f(x,y)
所以,对于数字图像这样离散的矩阵来说,其Laplacian变换近似为:
∇
2
f
=
[
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
]
−
4
f
(
x
,
y
)
\nabla^2f=[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y)
∇2f=[f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)]−4f(x,y)
为了方便做卷积,得到矩阵形式的Laplace算子:
[
0
1
0
1
−
4
1
0
1
0
]
\begin{bmatrix} 0&1&0\\ 1&-4&1\\ 0&1&0 \end{bmatrix}
⎣⎡0101−41010⎦⎤
将其在8-邻域进行扩展,得到扩展的Laplace算子:
[
1
1
1
1
−
8
1
1
1
1
]
\begin{bmatrix} 1&1&1\\ 1&-8&1\\ 1&1&1 \end{bmatrix}
⎣⎡1111−81111⎦⎤
这即是通常使用的Laplace模板
- Canny算法:
Canny算法是对Sobel算法的更进一步操作。首先用高斯滤波降低噪音对图像的影响,再用Sobel算子计算出图像的梯度,包括幅值和方向。对每个像素点,判断其是否是其梯度方向上的极大值,如果不是则抑制(置0)。最后用双阈值进行检测和连接,即大于高阈值的确定保留,小于低阈值的一定抑制,介于两者之间的像素点,如果它的8-邻域中存在确定保留点,则保留,否则抑制。
其中判断梯度方向极大值时,需要使用插值法构建虚拟像素点,称为亚像素点。使用Canny算法得到的图像边缘很细,且对噪音的滤去效果较好。
2. 直线检测
在边缘检测的基础上,使用Hough变换可以对图像进行直线检测。Hough变换是图像变换中的经典手段之一,主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。霍夫变换寻找直线与圆的方法相比与其它方法可以更好的减少噪声干扰。下面以直线为例,介绍Hough变换的思想原理。
每个像素坐标点经过变换都变成都直线特质有贡献的统一度量,一个简单的例子如下:一条直线在图像中是一系列离散点的集合,通过一个直线的离散极坐标公式,可以表达出直线的离散点几何等式如下:
X ∗ c o s ( θ ) + y ∗ s i n ( θ ) = r X *cos(\theta) + y * sin(\theta) = r X∗cos(θ)+y∗sin(θ)=r
其中角度
θ
\theta
θ 指
r
r
r 与
X
X
X 轴之间的夹角,
r
r
r 为到直线几何垂直距离。任何在直线上点,
x
x
x,
y
y
y 都可以表达,其中
r
r
r,
θ
\theta
θ 是常量。该公式图形表示如下:
然而在实现的图像处理领域,图像的像素坐标
P
(
x
,
y
)
P(x, y)
P(x,y) 是已知的,而
r
r
r,
θ
\theta
θ 则是我们要寻找的变量。如果我们能绘制每个
(
r
,
θ
)
(r, \theta)
(r,θ) 值根据像素点坐标
P
(
x
,
y
)
P(x, y)
P(x,y) 值的话,那么就从图像笛卡尔坐标系统转换到极坐标霍夫空间系统,这种从点到曲线的变换称为直线的霍夫变换。变换通过量化霍夫参数空间为有限个值间隔等分或者累加格子。当霍夫变换算法开始,每个像素坐标点
P
(
x
,
y
)
P(x, y)
P(x,y) 被转换到
(
r
,
t
h
e
t
a
)
(r, theta)
(r,theta) 的曲线点上面,累加到对应的格子数据点,当一个波峰出现时候,说明有直线存在。同样的原理,我们可以用来检测圆,只是对于圆的参数方程变为如下等式:
( x – a ) 2 + ( y − b ) 2 = r 2 (x –a ) ^2 + (y-b) ^ 2 = r^2 (x–a)2+(y−b)2=r2
其中 ( a , b ) (a, b) (a,b) 为圆的中心点坐标, r r r 为圆的半径。这样霍夫的参数空间就变成一个三维参数空间。给定圆半径转为二维霍夫参数空间,变换相对简单,也比较常用。
二、具体实现及结果(MATLAB)
Hough变换函数代码
function linedetect(Img,method)
Img_edge=edge(Img,method);%Canny方法提取图像边界,返回二值图像(边界1,否则0)
[H,T,R]=hough(Img_edge);%计算二值图像的标准霍夫变换,H为霍夫变换矩阵,I,R为计算霍夫变换的角度和半径值
P=houghpeaks(H,3);%提取3个极值点
lines=houghlines(Img_edge,T,R,P);%提取线段
imshow(Img), hold on;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%画出线段
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');%起点
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%终点
end
end
得到结果
当
P=houghpeaks(H,3); %提取3个极值点
时,对于三种边缘检测得到的图像进行直线检测结果如下:
Sobel边缘检测:
Laplacian边缘检测:
Canny边缘检测:
当
P=houghpeaks(H,5); %提取5个极值点
时,对于三种边缘检测得到的图像进行直线检测结果如下:
Sobel边缘检测:
Laplacian边缘检测:
Canny边缘检测:
当
P=houghpeaks(H,9); %提取9个极值点
时,对于三种边缘检测得到的图像进行直线检测结果如下:
Sobel边缘检测:
Laplacian边缘检测:
Canny边缘检测:
分析总结
对于参数相同的Hough算法来说,边缘提取的结果直接影响到直线检测的结果。通过上述实验比较可以看出,Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素;当对精度要求不是很高时,是一种较为常用的边缘检测方法。
Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。
Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉, Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。
对于相同的边缘检测结果来说,当Hough变换中提取的极值点数目不同是,直线检测结果也不相同。通过上述实验比较可以看出,当极值点数目较小时,检测到的直线数目也较少,而当极值点数目较大时,由于可以将原本更加断续的点纳入直线范畴,所以检测到的直线更多,且连续性更。
参考资料
- 冈萨雷斯.数字图像处理(第三版)[M].北京:电子工业出版社.2017.1
数字图像处理作业链接:
数字图像处理第一次作业——Bmp格式与基本变换
数字图像处理第二次作业——图像仿射变换
数字图像处理第三次作业——基于直方图的图像空域操作
数字图像处理第四次作业——空域滤波与边缘检测
数字图像处理第五次作业——频域滤波器
数字图像处理第六次作业——图像噪声和恢复
数字图像处理第七次作业——图像直线检测