概念

Scharr:

当内核大小为3时, 以上Sobel内核可能产生比较明显的误差(毕竟,Sobel算子只是求取了导数的近似值)。 为解决这一问题,OpenCV提供了 Scharr 函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,不怕干扰,其内核为:

img

拉普拉斯算子(Laplacian):

拉普拉斯算子是图像邻域内像素灰度差分计算的基础,通过二阶微分推导出的一种图像邻域增强算法。它的基本思想是当邻域的中心像素灰度低于它所在邻域内的其他像素的平均灰度时,此中心像素的灰度应该进一步降低;当高于时进一步提高中心像素的灰度,从而实现图像锐化处理。
在算法实现过程中,通过对邻域中心像素的四方向或八方向求梯度,并将梯度和相加来判断中心像素灰度与邻域内其他像素灰度的关系,并用梯度运算的结果对像素灰度进行调整。
一个连续的二元函数f(x,y),其拉普拉斯运算定义为:

对于数字图像,拉普拉斯算子可以简化为:

也可以按卷积形式表示:

其中K=1,I=1时H(r,s)取下式,四方面模板:

通过模板可以发现,当邻域内像素灰度相同时,模板的卷积运算结果为0;当中心像素灰度高于邻域内其他像素的平均灰度时,模板的卷积运算结果为正数;当中心像素的灰度低于邻域内其他像素的平均灰度时,模板的卷积的负数。对卷积运算的结果用适当的衰弱因子处理并加在原中心像素上,就可以实现图像的锐化处理。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import cv2
import numpy as np
img_thresh = cv2.imread("a28_thresh.png")

sobelx = cv2.Sobel(img_thresh,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img_thresh,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
#scharry 比sobel算子更敏感 细节更多
scharrx = cv2.Scharr(img_thresh,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img_thresh,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
#lapacian 对变化敏感
laplacian = cv2.Laplacian(img_thresh,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

cv2.imshow('sobelxy',sobelxy)
cv2.imshow('scharrxy',scharrxy)
cv2.imshow('laplacian',laplacian)
cv2.waitKey(0)
# res = np.hstack((sobelxy,scharrxy,laplacian))
# cv2.imshow('res',res)
# cv2.waitKey(0)
cv2.destroyAllWindows()

image-20230304165848929