其他分享
首页 > 其他分享> > 在OpenCV中,cv2.filter2D()需要哪些数据类型?

在OpenCV中,cv2.filter2D()需要哪些数据类型?

作者:互联网

我正在教自己关于边缘检测器的知识,并且尝试使用OpenCV的filter2D来实现自己的渐变计算器,类似于cv2.Sobel().在OpenCV的Python界面中,cv2.filter2D()允许用户使用自定义滤镜对图像进行卷积.在OpenCV命名法中,此过滤器称为“内核”.

使用来自MIT pedestrian dataset的图像(per00001.png),我发现cv2.Sobel()产生了合理的输出. (下面的代码为output image is here.)

#OpenCV's Sobel code (outputs nice-looking gradient)
import cv2, numpy
img = cv2.imread("./per00001.png")

gradientX = cv2.Sobel(img, -1, 1, 0)

compression_params = [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 9]
cv2.imwrite("gradientX.png", gradientX, compression_params)

↑好

↓破碎

当我尝试实现自己的类似于Sobel()的代码时(如下),我得到all-black image.我推测问题出在我要传入cv2.filter2D的内核参数的数据类型(horizo​​ntalSobelMtx). ().但是,我找不到关于cv2.filter2D()的内核数据类型的任何文档.

#Custom Sobel code (outputs all-black image)
import cv2, numpy
img = cv2.imread("./per00001.png")

horizontalSobelMtx = [[-1,0,1],[-2,0,2],[-1,0,1]]
horizontalSobelMtx = numpy.asanyarray(horizontalSobelMtx) #guessing about appropriate datatype.
gradientX_customSobel = cv2.filter2D(img, -1, horizontalSobelMtx)

compression_params = [cv2.cv.CV_IMWRITE_PNG_COMPRESSION, 9]
cv2.imwrite("gradientX_customSobel.png", gradientX_customSobel, compression_params)

所以,这是我的问题:

1)cv2.filter2D(…,kernel,…)对内核参数期望什么数据类型?

2)如果这里不是内核的数据类型,那么是什么导致我的自定义Sobel代码输出空白图像?

解决方法:

卷积核的系数应始终为浮动-
点号.这意味着分配该矩阵时应使用CV_32FC1.
在此特定示例中,请尝试:

horizontalSobelMtx = [[-1,0,1],[-2,0,2],[-1,0,1]]
horizontalSobelMtx = numpy.asanyarray(horizontalSobelMtx, np.float32)

标签:edge-detection,convolution,opencv,gradient,python
来源: https://codeday.me/bug/20191031/1979376.html