单页网站有哪些,网页制作软件下载中文版,智慧团建网站登陆,查服务器ip地址Laplacian算子边缘检测的来源 在边缘部分求取一阶导数#xff0c;你会看到极值的出现#xff1a; 如果在边缘部分求二阶导数会出现什么情况? 从上例中我们可以推论检测边缘可以通过定位梯度值大于邻域的相素的方法找到(或者推广到大 于一个阀值). 从以上分析中#xff0c…Laplacian算子边缘检测的来源 在边缘部分求取一阶导数你会看到极值的出现 如果在边缘部分求二阶导数会出现什么情况? 从上例中我们可以推论检测边缘可以通过定位梯度值大于邻域的相素的方法找到(或者推广到大 于一个阀值). 从以上分析中我们推论二阶导数可以用来检测边缘 。 因为图像是 “2维”, 我们需要在两个方向求导。使用Laplacian算子将会使求导过程变得简单。
Laplacian定义 代码实现
import cv2
import numpy as np imgcv2.imread(lenna.png,0)#为了让结果更清晰图像有3个channel这里的ksize设为3
gray_lapcv2.Laplacian(img,cv2.CV_16S,ksize3)#拉式算子
dstcv2.convertScaleAbs(gray_lap)cv2.imshow(laplacian,dst)cv2.waitKey(0)
cv2.destroyAllWindows()
结果展示 需要注意的几个点
注意一 Laplacian算子的调用函数解析 在OpenCV-Python中Laplace算子的函数原型如下 dst cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) 第一个参数是需要处理的图像 第二个参数是图像的深度-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度 dst不用解释了 ksize是算子的大小必须为1、3、5、7。默认为1。 scale是缩放导数的比例常数默认情况下没有伸缩系数 delta是一个可选的增量将会加到最终的dst中同样默认情况下没有额外的值加到dst中 borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。
注意二 ddepth(目标图像深度)为什么是cv2.CV_16S 这里引用了OpenCV 图像梯度 cv2.Sobel()cv2.Schar()cv2.Laplacian() 数据类型设置cv2.CV_8Ucv2.CV_16Scv2.CV_64F 当我们可以通过参数-1 来设定输出图像的深度数据类型与原图像保持一致但是我们在代码中使用的却是cv2.CV_64F。这是为什么呢想象一下一个从黑到白的边界的导数是整数而一个从白到黑的边界点导数却是负数。如果原图像的深度是np.int8 时所有的负值都会被截断变成0换句话说就是把把边界丢失掉。所以如果这两种边界你都想检测到最好的的办法就是将输出的数据类型设置的更高比如cv2.CV_16Scv2.CV_64F 等。取绝对值然后再把它转回到cv2.CV_8U。下面的示例演示了输出图片的深度不同造成的不同效果。 注意三 ksize3为什么 laplace内部是调用sobel来实现而这个算子的大小实际是sobel的kernel_size用于计算二阶导数的滤波器的孔径尺寸大小必须为正奇数正奇数才能有中心点