在数学中, 微分是对函数的局部变化率的一种线性描述. 微分可以近似地描述当函数自变量的取值作足够小的改变时, 函数的值是怎样改变的. 最简单的各向同性微分算子是拉普拉斯算子. 一个二元图像函数 f(x,y) 的拉普拉斯变换定义为
∇
2
f
=
∂
2
f
∂
x
2
+
∂
2
f
∂
y
2
∇^2f=\frac{∂^2f}{∂x^2}+\frac{∂^2f}{∂y^2}
∇2f=∂x2∂2f+∂y2∂2f
为了更适合于图像处理, 这一方程必须表现为离散形式. 考虑到有两个变量, 因此, 我们在 x 方向上对二阶偏微分采用下列定义:
∂
2
f
∂
x
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
−
2
f
(
x
,
y
)
\frac{∂^2f}{∂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)
类似的, 在 y 方向上为
∂
2
f
∂
y
2
=
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
2
f
(
x
,
y
)
\frac{∂^2f}{∂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
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
4
f
(
x
,
y
)
∇^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)
因此,执行这一新定义的掩膜如下:
由于拉普拉斯算子是一种微分算子, 它的应用强调图像中灰度的突变和降低灰度慢变化的区域. 这将产生一幅把图像中的浅灰色边线和突变点叠加到暗背景中的图像. 将原始图像和拉普拉斯图像叠加在一起的简单方法可以保护拉普拉斯锐化后的效果, 同时又能复原背景信息.
常见拉普拉斯算子有
使用拉普拉斯算子对图像进行增强的基本表示方法如下
在机理中, 我们首先使用拉普拉斯算子过滤图像, 然后, 从原图像中减去该图像。
g
(
x
,
y
)
=
5
f
(
x
,
y
)
−
[
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
]
g(x,y)=5f(x,y)-[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]
g(x,y)=5f(x,y)−[f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)]
import numpy as np
import scipy.signal
import cv2
def convert_2d(r):
kernel = np.array([
[0,-1,0],
[-1,5,-1],
[0,-1,0]
])
s = scipy.signal.convolve2d(r,kernel,mode='same',boundary='symm')
for i in range(s.shape[0]):
for j in range(s.shape[1]):
s[i][j] = min(max(0,s[i][j]),255)
s = s.astype(np.uint8)
return s
def convert_3d(r):
s_dsplit= []
for d in range(r.shape[2]):
rr = r[:,:,d]
ss = convert_2d(rr)
s_dsplit.append(ss)
s = np.dstack(s_dsplit)
return s
im = cv2.imread('tetet.jpg')
im_convert_mat = convert_3d(im)
cv2.imshow('ruihua',im_convert_mat)
cv2.imwrite('ruihua.jpg',im_convert_mat)
cv2.waitKey()