目录
一、环境
本文使用环境为:
- Windows10
- Python 3.9.17
- opencv-python 4.8.0.74
二、拉普拉斯原理
拉普拉斯算子是一种常用于图像处理的边缘检测技术,它有助于识别图像中的边缘和纹理特征。原理上,拉普拉斯算子是利用二阶差分计算边缘的。在一阶微分图中,极大值或极小值被认为是边缘;在二阶微分图中,极大值和极小值之间的过0点也被认为是边缘。
具体来说,拉普拉斯算子的一阶差分定义为f ' (x) = f (x) - f (x - 1),二阶差分定义为f ' (x) = (f (x + 1) - f (x)) - (f (x) - f (x - 1))。化简后得到f ' (x) = f (x - 1) - 2 f (x)) + f (x + 1)。在二维的情况下,拉普拉斯算子定义为f ' (x, y) = -4 f (x, y) + f (x-1, y) + f (x+1, y) + f (x, y-1) + f (x, y+1)。
因此,拉普拉斯算子具有各方向同性的特点,能够对任意方向的边缘进行提取,具有无方向性的优点,使用Laplacian算子提取边缘不需要分别检测X方向的边缘和Y方向的边缘,只需要一次边缘检测即可。
cv2.Laplacian()
是OpenCV库中的一个函数,用于进行图像的拉普拉斯边缘检测。
该函数的基本语法如下:
python
cv2.Laplacian(src, ddepth, ksize[, dst[, scale[, delta[, borderType]]]])
参数说明:
src
: 输入图像,通常为灰度图。ddepth
: 输出图像的深度,可选参数,默认值为-1,表示与输入图像相同。ksize
: 用于计算拉普拉斯算子的核大小,必须为奇数。dst
: 输出图像,可选参数,默认值为None。scale
: 可选参数,默认值为1。delta
: 可选参数,默认值为0。borderType
: 可选参数,默认值为cv2.BORDER_DEFAULT。
返回值:
dst
: 经过拉普拉斯边缘检测后的输出图像。
三、完整代码
python
"""
使用拉普拉斯检测图像边缘
"""
import sys
import cv2 as cv
def main(argv):
# 边缘输出数据类型,后续转uint8
ddepth = cv.CV_16S
kernel_size = 3
window_name = "Laplace Demo"
# 读个图片
imageName = argv[0] if len(argv) > 0 else 'data/lena.jpg'
src = cv.imread(cv.samples.findFile(imageName), cv.IMREAD_COLOR)
if src is None:
print ('Error opening image')
print ('Program Arguments: [image_name -- default lena.jpg]')
return -1
# 高斯降噪
src = cv.GaussianBlur(src, (3, 3), 0)
# 彩色图转灰度图
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)
# 拉普拉斯检测边缘
dst = cv.Laplacian(src_gray, ddepth, ksize=kernel_size)
# 边缘数据类型转为uint8
abs_dst = cv.convertScaleAbs(dst)
cv.imshow(window_name, abs_dst)
cv.waitKey(0)
return 0
if __name__ == "__main__":
main(sys.argv[1:])