我正在自学边缘检测器,并且正在尝试使用 OpenCVfilter2D
实现我自己的梯度计算器,类似于cv2.Sobel()
。在 OpenCV 的 Python 接口中,cv2.filter2D()
允许用户使用自定义过滤器对图像进行卷积。在 OpenCV 术语中,该过滤器称为“内核”。
使用图像(per00001.png http://dl.dropbox.com/u/35993/OpenCV_StackOverflow/per00001.png) 来自麻省理工学院行人数据集 http://cbcl.mit.edu/software-datasets/PedestrianData.html, 我发现cv2.Sobel()
产生看起来合理的输出。 (代码如下,输出图像在这里 http://dl.dropbox.com/u/35993/OpenCV_StackOverflow/gradientX.png.)
#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)
↑ GOOD
↓ BROKEN
当我尝试实现自己的Sobel()
-类似代码(如下),我得到一个全黑图像 http://dl.dropbox.com/u/35993/OpenCV_StackOverflow/gradientX_customSobel.png。我推测问题出在内核参数的数据类型上(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)
所以,这是我的问题:
1)什么数据类型cv2.filter2D(..., kernel, ...)
期望为kernel
范围?
2) 如果数据类型为kernel
问题不是在这里,那么是什么导致我的自定义 Sobel 代码输出空白图像?