我正在自学边缘检测器,我正在尝试使用 OpenCVfilter2D
来实现我自己的梯度计算器,类似于cv2.Sobel()
. 在 OpenCV 的 Python 接口中,cv2.filter2D()
允许用户使用自定义过滤器对图像进行卷积。在 OpenCV 命名法中,此过滤器称为“内核”。
使用来自MIT 行人数据集的图像( per00001.png),我发现它产生了一个看起来合理的输出。(代码在下面,输出图像在这里。)cv2.Sobel()
#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()
类似代码(如下)时,我得到一个全黑图像。我推测问题出在horizontalSobelMtx
我传入的内核参数 ()的数据类型上cv2.filter2D()
。但是,我无法找到任何有关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)
所以,这是我的问题:
cv2.filter2D(..., kernel, ...)
1) 参数期望什么数据类型kernel
?
2)如果这里的数据类型kernel
不是问题,那么是什么导致我的自定义 Sobel 代码输出空白图像?