在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的内核参数的数据类型(horizontalSobelMtx). ().但是,我找不到关于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