前面我们介绍过了图像的梯度,以及图像的几个梯度算子。
这些本质上都是一阶导数,或一阶微分。就是求图像灰度变化的导数,能够突出图像中的对象边缘。那有一阶导数,有没有二阶导数呢?求导数的导数,这对灰度变化强烈的地方会更敏感。
在微积分中,一维函数的一阶微分的基本定义是这样的:
d
f
d
x
=
lim
ϵ
→
0
f
(
x
+
ϵ
)
−
f
(
x
)
ϵ
\frac{df}{dx}=\lim_{\epsilon\rightarrow 0 }{\frac{f(x+\epsilon )-f(x)}{\epsilon }}
dxdf=ϵ→0limϵf(x+ϵ)−f(x)
那么,二阶微分的基本定义就是这样的:
d
2
f
d
x
2
=
lim
ϵ
→
0
f
′
(
x
+
ϵ
)
−
f
′
(
x
)
ϵ
\frac{d^2f}{dx^2}=\lim_{\epsilon\rightarrow 0 }{\frac{f'(x+\epsilon )-f'(x)}{\epsilon }}
dx2d2f=ϵ→0limϵf′(x+ϵ)−f′(x)
而图像是一个二维函数f(x,y),其二阶微分当然就是二阶偏微分。但为推导简单起见,我们先按x方向的一维函数来推导:
∂
f
∂
x
=
lim
ϵ
→
0
f
(
x
+
ϵ
)
−
f
(
x
)
ϵ
\frac{\partial f}{\partial x}=\lim_{\epsilon\rightarrow 0 }{\frac{f(x+\epsilon )-f(x)}{\epsilon }}
∂x∂f=ϵ→0limϵf(x+ϵ)−f(x)
图像是按照像素来离散的,最小的
ϵ
ϵ
ϵ就是1像素。因此有:
∂
f
∂
x
=
f
′
(
x
)
=
f
(
x
+
1
)
−
f
(
x
)
\frac{\partial f}{\partial x}=f'(x)=f(x+1)-f(x)
∂x∂f=f′(x)=f(x+1)−f(x)
那么二阶微分就是:
∂
2
f
∂
x
2
=
∂
f
′
(
x
)
d
x
2
=
f
′
(
x
+
1
)
−
f
′
(
x
)
\frac{\partial^2f}{\partial x ^2}=\frac{\partial f'(x)}{dx^2}=f'(x+1)-f'(x)
∂x2∂2f=dx2∂f′(x)=f′(x+1)−f′(x)
根据上面的一阶微分,则:
∂
2
f
∂
x
2
=
∂
f
′
(
x
)
d
x
2
=
f
′
(
x
+
1
)
−
f
′
(
x
)
=
f
(
(
x
+
1
)
+
1
)
−
f
(
(
x
+
1
)
)
−
(
f
(
x
+
1
)
−
f
(
x
)
)
=
f
(
x
+
2
)
−
f
(
x
+
1
)
−
f
(
x
+
1
)
+
f
(
x
)
=
f
(
x
+
2
)
−
2
f
(
x
+
1
)
+
f
(
x
)
\begin{aligned} \frac{\partial^2f}{\partial x ^2}&=\frac{\partial f'(x)}{dx^2}=f'(x+1)-f'(x) \\ &=f((x+1)+1)-f((x+1))-(f(x+1)-f(x)) \\ &=f(x+2)-f(x+1)-f(x+1)+f(x) \\ &=f(x+2)-2f(x+1)+f(x) \\ \end{aligned}
∂x2∂2f=dx2∂f′(x)=f′(x+1)−f′(x)=f((x+1)+1)−f((x+1))−(f(x+1)−f(x))=f(x+2)−f(x+1)−f(x+1)+f(x)=f(x+2)−2f(x+1)+f(x)
令
x
=
x
−
1
x=x-1
x=x−1,则:
∂
2
f
∂
x
2
=
f
(
x
+
1
)
+
f
(
x
−
1
)
−
2
f
(
x
)
\frac{\partial^2f}{\partial x ^2}=f(x+1)+f(x-1)-2f(x)
∂x2∂2f=f(x+1)+f(x−1)−2f(x)
于是,在x和y方向上,有:
∂
2
f
∂
x
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
x
,
y
)
\frac{\partial^2f}{\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^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)
我们把x方向和y方向的二阶导数结合在一起:
∂
2
f
∂
x
2
+
∂
2
f
∂
y
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
4
f
(
x
,
y
)
\frac{\partial^2f}{\partial x ^2}+\frac{\partial^2f}{\partial y ^2}=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)
∂x2∂2f+∂y2∂2f=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)
这实质上就是著名的拉普拉斯二阶微分算子(Laplacian)。我们看一下实际效果。
import cv2
import numpy as np
moon = cv2.imread("moon.tif", 0)
row, column = moon.shape
moon_f = np.copy(moon)
moon_f = moon_f.astype("float")
two = np.zeros((row, column))
for x in range(1, row - 1):
for y in range(1, column - 1):
two[x, y] = moon_f[x + 1, y] \
+ moon_f[x - 1, y] \
+ moon_f[x, y + 1] \
+ moon_f[x, y - 1] \
- 4 * moon_f[x, y]
sharp = moon_f - two
sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp))
sharp = sharp.astype("uint8")
cv2.imshow("moon", moon)
cv2.imshow("sharp", sharp)
cv2.waitKey()
输出结果:
我们可以看到,图像增强的效果比前几篇文章介绍的一阶微分要好很多。
需要注意,将原图像与拉普拉斯二阶导数图像合并的时候,必须考虑符号上的差别。注意上面的代码中用的是减号,而不是一阶导数中用的加号。到底用加号还是减号,与中心点
f
(
x
,
y
)
f(x,y)
f(x,y)的系数有关,这个定义的拉普拉斯二阶导数中,
f
(
x
,
y
)
f(x,y)
f(x,y)的系数是-4,是负的,原图像就要减去拉普拉斯二阶导数图像;拉普拉斯二阶导数还有其它的形式,例如:
L
a
p
l
a
c
i
a
n
=
4
f
(
x
,
y
)
−
f
(
x
+
1
,
y
)
−
f
(
x
−
1
,
y
)
−
f
(
x
,
y
+
1
)
−
f
(
x
,
y
−
1
)
Laplacian = 4f(x,y)-f(x+1,y)-f(x-1,y)-f(x,y+1)-f(x,y-1)
Laplacian=4f(x,y)−f(x+1,y)−f(x−1,y)−f(x,y+1)−f(x,y−1)
这时 f ( x , y ) f(x,y) f(x,y)的系数是正的,原图像就要加上拉普拉斯二阶导数图像。
到这里,我们已经注意到,前面介绍图像一阶导数时,用的是绝对值,而二阶导数就没有使用绝对值,且需要考虑系数的正负符号问题,才能决定最后的图像合并是用原图像加上还是减去二阶导数图像,为什么是这样?这个下一篇再探讨。
转载自:https://blog.csdn.net/saltriver/article/details/78990520