基本概念
拉普拉斯算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度(▽f)的散度(▽·f)。因此如果f是二阶可微的实函数,则f的拉普拉斯算子定义为:
其中x与y代表 x-y 平面上的笛卡儿坐标:
Laplace 算子是一个二阶微分算子,它实际上是一个 x 方向的二阶导数和 y 方向的二阶导数之和的近似微分。该算子比较适合应用于只关心边缘位置而不考虑其周围像素灰度差值的图像边缘检测场景。
为了更适用于数字图像处理,可将 Laplace 算子表示为如下离散形式:
本文用了一种常用的离散laplace算子,和其扩展算子,读者可以比较发现扩展算子的图像噪声的影响更小。
#算子和图像矩阵处理模块
import numpy as np
#色彩映射模块
import matplotlib.cm as cm
#数据可视化处理模块
import matplotlib.pyplot as plt
#图像导入模块
from PIL import Image
#卷积运算的函数
import scipy.signal as signal
#定义拉普拉斯算子
operator_1 = ([[0,1,0],
[1,-4,1],
[0,1,0]])
#定义laplace扩展算子
operator_2 = ([[1,1,1],
[1,-8,1],
[1,1,1]])
#打开原图并且做灰度化处理
image = Image.open(r"C:\Users\86159\PycharmProjects\pythonProject2\test.jpg.jpg").convert('L')
#得到图像的矩阵
image_array =np.array(image)
#卷积计算后的图像矩阵
image_1 = signal.convolve2d(image_array,operator_1,mode='same')
image_2 = signal.convolve2d(image_array,operator_2,mode='same')
#归一化处理
image_1 = (image_1/float(image_2.max()))*255
image_2 = (image_2/float(image_2.max()))*255
#将大于灰度平均值的灰度值变成255,便于观察边缘
image_1[image_1>image_1.mean()]=255
image_2[image_2>image_2.mean()]=255
#显示边缘检测结果
plt.subplot(2,2,1)
plt.imshow(image_array,cmap=cm.gray)
plt.axis('off')
plt.subplot(2,2,3)
plt.imshow(image_1,cmap=cm.gray)
plt.axis('off')
plt.subplot(2,2,4)
plt.imshow(image_2,cmap=cm.gray)
plt.axis('off')
plt.show()
结果是显而易见的,但是本文并没有对图像先进行平滑处理,读者可以在其中添加一段模糊平滑处理的代码用以抵消由Laplace算子的二阶导数引起的逐渐增加的噪声影响。(可以用高斯滤波的办法作平滑处理)。