文章目录
- 哈密尔顿算子
- 梯度
- 散度
- 拉普拉斯算子
- 图像处理——拉普拉斯算子
在介绍拉普拉斯算子概念之前我们先介绍,哈密尔顿算子( ),梯度,散度等概念
哈密尔顿算子
所谓哈密尔顿算子即为某一物理量在笛卡尔坐标系下的偏导数的矢量和,其运算符号为:,定义如下:
梯度
当哈密尔顿算子作用于一个标量,比如函数时,既可以表示为该标量在该空间上的梯度
简而言之,梯度即为作用于某一标量的结果,其表示如下:
从上式不难发现,一个标量的梯度是一个矢量,它表示在空间中某一点沿着某一方向的变化量,如果想要得到在某一特定的方向(即不是笛卡尔标系的方向)的梯度,即方向导数。
方向导数可以根据梯度与该方向的点乘得到,其中表示沿着方向的步长:
由上式可得,当时,即空间上的某一方向与梯度方向一致时,表示沿该方向上有最大梯度,这也正符合我们所熟知的在空间上任一点的梯度为该点在空间上变化量最大的方向
散度
根据矢量的运算规则,当与一个矢量相乘时,其结果是一个标量,它代表着该矢量的散度:
其中表示一个矢量
关于散度大小定义:
拉普拉斯算子
我们已经只带散度是由与一个矢量相乘时得到的,因此梯度作为一个矢量我们可以对其继续求散度,从而引入拉普拉斯算子
拉普拉斯算子从某种程度上看是对某一函数求二阶导数,我们在学数学分析的时候知道一阶导数表示函数某一点的变化量,而二阶导数则表示该点的变化速率,即凹凸性,我们将其放在图像上观察
右图图为左图的向量场,即由梯度组成的向量场,我们不难发现,向量场箭头汇聚的地方正好对应着三维图中凸点,向外发散的地方对应着凹点。
图像处理——拉普拉斯算子
假设一张图片的的某一列值看做函数,我们对其进行泰勒展开可以得到:
上式中,是取样间隔。由于我们是对图像进行处理,所以这个间隔的单位是像素。所以我们对前面取样有,对后面取样有,当时,上式可化为:
同样当时有:
对于一阶导数,我们只使用线性项,向前差分可以得到:
向后差分可以得到:
中心差分可的得到:
我们仅仅使用一阶导数展开,一般来说,用来表示导数的泰勒级数的项越多,近似就越精确。包含更多的项意味着在近似中使用更多的点,产生更小的误差。然而,对于相同数量的点来说,已经证明中心差分的误差较小。因此导数通常表示为中心差分。
基于中心差分的二阶导数可以由上面的泰勒展开与泰勒展开相加得到:
上述只是一维上的二阶导数,而图像往往是二维坐标,我们可以写出双变量形式的一阶导与二阶导:
不难想到拉普拉斯算子应用到图像上的形式为:
表现在图像上如下:
上右图便是拉普拉斯卷积核,该卷积核只考虑到了某一像素点的上下左右的位置,我们可以将其扩展为考虑到周围像素点的卷积核
如上图的卷积核,使用在图像上我们可以检测到孤立点。
为了在对图像做拉普拉斯卷积后为了可以更加突出孤立点,我们可以设置一个阈值,大于该阈值的像素点赋值为1,小于阈值的赋值为0.
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
imgfile = "./ImageProcessAndPractice/images/cameraman.jpg"
OriginalPic = np.array(Image.open(imgfile).convert('L'), dtype=np.int)
img = np.zeros((OriginalPic.shape[0]+2, OriginalPic.shape[1]+2), np.int)
# im = mpimg.imread(imgfile)
# print(im)
# plt.imshow(im)
######## 制造遍历图像 ###################
for i in range(1, img.shape[0]-1):
for j in range(1, img.shape[1]-1):
img[i][j] = OriginalPic[i-1][j-1]
# 定义阈值函数
def threshold(x,v):
if x > v:
x = 255
if x < v:
x = 0
return x
LaplacePic = np.zeros((OriginalPic.shape[0], OriginalPic.shape[1]), dtype=np.uint8)
kernel = [[1, 1, 1], [1, -8, 1], [1, 1, 1]]
for i in range(0, LaplacePic.shape[0]):
for j in range(0, LaplacePic.shape[1]):
LaplacePic[i][j] = threshold(abs(np.sum(np.multiply(kernel, img[i:i+3, j:j+3]))), 200)
fig = plt.figure(figsize=(12, 6))
plt.subplot(1,2,1)
plt.imshow(OriginalPic, cmap='gray')
plt.axis('off')
plt.subplot(1,2,2)
plt.imshow(LaplacePic, cmap='gray')
plt.axis('off')
其输出如下
文章出处登录后可见!