两年的研究僧图像处理经验告诉我,微分锐化,积分平滑,至于为什么,仔细想想微分和积分的曲线图就知道了。
拉普拉斯算子是二阶微分,由于图像是坐标系中离散的点,微分方程如下:
二阶微分推导过程如下:
对应的算子矩阵如下:
那就尝试一下,cv库有自带的拉普拉斯函数 cv2.Laplacian,此处自写,加强理解。
import numpy
import cv2
def laplace2(img):
g = numpy.array(((0, 1, 0), (1, -4, 1), (0, 1, 0)))
# g = numpy.array(((1, 1, 1), (1, -8, 1), (1, 1, 1)))
re = numpy.zeros_like(img) #生成与img相同shape的全0数组
for i in range(1, img.shape[0] - 1):
for j in range(1, img.shape[1] - 1):
re[i, j] = (img[i-1 : i+2, j-1 : j+2] * g).sum()#+img[i,j]
cv2.imwrite('./'+'1.jpg',re)
return re
img=cv2.imread('demo.jpg')
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
laplace2(img)
背景噪声还是很多的,所以通常先用高斯滤波消除噪声,本博客只是一个简单粗暴的实验,图片禁止盗取~
由此延伸,拉普拉斯算子是图像的二阶导,可以检测图像灰度值的快速变化,拉普拉斯算子经常用于图像的边缘检测。正常图像中边界清晰,经拉普拉斯计算后方差较大;模糊图像边界信息少,方差小。所以,可以利用拉普拉斯算子做图像的模糊检测。
一句代码搞定,cv2.Laplacian(image, cv2.CV_64F).var()。然后根据样本设置合适的阈值。