小白目前经手的科研课题涉及到在编码解码过程中增加各类噪声和相关滤波的处理,涉及到了一些算子处理,所以一边学习一边记录:若博文有不妥之处,望加以指点,笔者一定及时修正。
① Sobel算子
边缘是图像上灰度级变化很快的点的集合。那如何在图像上找到这些点呢?
高数中,我们知道如果函数点变化很快,其导数越大。也就是导数越大的地方越有可能是边缘。但是计算机不常用,因为存在导数无穷大的情况,计算机难以表达。所以,计算机就采用微分的形式。连续函数 x x x变化了 d x dx dx,导致 y y y变化了 d y dy dy, d y dy dy值越大表示变化的越大,那么计算整幅图像的微分, d y dy dy的大小就是边缘的强弱了。微分与导数的关系: d y = f ′ ( x ) d x dy = f '(x) dx dy=f′(x)dx。
举个例子:
经过微分之后,平缓的地方
d
y
dy
dy几乎为0,而边缘的地方绝对值很大,真实值有正负情况。连续函数里面有微分,离散里面是差分,也是求变化率。差分的定义
f
′
(
x
)
=
f
(
x
+
1
)
−
f
(
x
)
f^{'}(x)=f(x+1)-f(x)
f′(x)=f(x+1)−f(x),后一项减去前一项。 Sobel算子是一阶微分的边缘检测算子,该算子引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。
模板运算基本思路:将原图像中某个像素的值,作为它本身灰度值和其相邻像素灰度值进行运算的函数。模板中有一个锚点,通常是矩阵中心点,和原图像中待计算点对应;整个模板对应的区域,就是原图像中像素点的相邻区域,模板运算目的是让图像变好。
Sobel算子包含两组 3 ∗ 3 3*3 3∗3 的矩阵,分别为横向及纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。下面是 G x G_x Gx 和 G y G_y Gy 的相关模板,但是实用卷积的时候,需要把相关模板旋转180度再与图像做卷积的操作。
G
x
=
[
−
1
0
+
1
−
2
0
+
2
−
1
0
+
1
]
G_x = \left[ \begin{matrix} -1 & 0 & +1 \\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{matrix} \right]
Gx=⎣⎡−1−2−1000+1+2+1⎦⎤
G
y
=
[
−
1
−
2
−
1
0
0
0
+
1
+
2
+
1
]
G_y = \left[ \begin{matrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ +1 & +2 & +1 \end{matrix} \right]
Gy=⎣⎡−10+1−20+2−10+1⎦⎤卷积的时候运用的是:
G
x
G_x
Gx是对原图
x
x
x方向上的卷积,
G
y
G_y
Gy是对原图
y
y
y方向上的卷积(卷积:卷积可以理解为一个过程:元素对应相乘,乘积累加,是一个线性操作):
G
x
=
[
+
1
0
−
1
+
2
0
−
2
+
1
0
−
1
]
G_x = \left[ \begin{matrix} +1 & 0 & -1 \\ +2 & 0 & -2 \\ +1 & 0 & -1 \end{matrix} \right]
Gx=⎣⎡+1+2+1000−1−2−1⎦⎤
G
y
=
[
+
1
+
2
+
1
0
0
0
−
1
−
2
−
1
]
G_y = \left[ \begin{matrix} +1 & +2 & +1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{matrix} \right]
Gy=⎣⎡+10−1+20−2+10−1⎦⎤
具体计算为:图像上的每一个像素点的横向和纵向灰度值结合起来计算该点灰度的大小:
G
=
G
x
2
+
G
y
2
2
G=\sqrt[2]{{G_x}^2+{G_y}^2}
G=2Gx2+Gy2然后计算梯度方向:
Θ
=
a
r
c
t
a
n
(
G
y
G
x
)
\Theta = arctan(\frac{G_y}{G_x})
Θ=arctan(GxGy)
这个相关模板一般都是奇数:因为模板是偶数的话,卷积出来的结果应该是放在中间的,不方便表示。使用奇数保证锚点(卷积核的中心)刚好在中间,方便以模块中心为标准进行滑动卷积。同时保证了padding时,图像的两边依然相对称。
缺点:
Sobel算子并没有将图像的主题与背景严格地区分开来,所以提取的图像轮廓有时并不能令人满意。
当然还有另外一个比Sobel函数的近似效果更好的 Scharr函数,其内核矩阵如下:
② Laplace算子
拉普拉斯算子是一个二阶微分算子,定义为梯度 ∇ f \nabla{f} ∇f和散度 ∇ f ′ \nabla{f^{'}} ∇f′。对图像求二阶导数,因为图像是二维的,所以不用分开求横向和纵向的导数,然后相加。
离散形式,在一个二维函数
f
(
x
,
y
)
f(x,y)
f(x,y) 中,
x
,
y
x,y
x,y 两个方向的二阶差分分别为:
∂
2
f
∂
x
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
x
,
y
)
\frac{\partial ^{2}f}{\partial x^2}=f(x+1,y)+f(x-1,y)-2f(x,y)
∂x2∂2f=f(x+1,y)+f(x−1,y)−2f(x,y)
∂
2
f
∂
y
2
=
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
x
,
y
)
\frac{\partial ^{2}f}{\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)所以拉普拉斯算子的差分形式为:
∇
2
f
(
x
,
y
)
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
4
f
(
x
,
y
)
\nabla^2f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)
∇2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)
图像锐化:使灰度反差增强,从而使模糊图像变得更加清晰。
图像模糊:图像受到平均运算或积分运算,对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。
拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。
因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像!
拉普拉斯算子模板:
G
=
[
0
1
0
1
−
4
1
0
1
0
]
G= \left[ \begin{matrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{matrix} \right]
G=⎣⎡0101−41010⎦⎤该模板在上下左右四个90度的方向上结果相同,也就是说在90度方向上无方向性。
其他常用的模板还有:
目的:在45度的方向上也具有无方向,对该模板进行扩展定义为
G
=
[
1
1
1
1
−
8
1
1
1
1
]
G= \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & -8 & 1 \\ 1 & 1 & 1 \end{matrix} \right]
G=⎣⎡1111−81111⎦⎤缺点:
1、没有了边缘的方向信息;
2、双倍加强了噪声的影响。
③ 参考博客
这几位的博客十分好,隆重推荐!