Python 在OpenCV中,cv2.filter2D()需要什么数据类型?

Python 在OpenCV中,cv2.filter2D()需要什么数据类型?,python,opencv,gradient,edge-detection,convolution,Python,Opencv,Gradient,Edge Detection,Convolution,我在自学边缘检测器,并尝试使用OpenCV的filter2D实现我自己的梯度计算器,类似于cv2.Sobel()。在OpenCV的Python接口中,cv2.filter2D()允许用户使用自定义过滤器卷积图像。在OpenCV术语中,这个过滤器被称为“内核” 使用来自的图像(),我发现cv2.Sobel()生成的输出外观合理。(代码如下,) ↑ 好 ↓ 破碎的 当我尝试实现自己的Sobel()-类似于下面的代码时,我得到了一个。我推测问题在于我要传递到cv2.filter2D()的内核参数(h

我在自学边缘检测器,并尝试使用OpenCV的
filter2D
实现我自己的梯度计算器,类似于
cv2.Sobel()
。在OpenCV的Python接口中,
cv2.filter2D()
允许用户使用自定义过滤器卷积图像。在OpenCV术语中,这个过滤器被称为“内核”

使用来自的图像(),我发现
cv2.Sobel()
生成的输出外观合理。(代码如下,)

↑ 好


↓ 破碎的

当我尝试实现自己的
Sobel()
-类似于下面的代码时,我得到了一个。我推测问题在于我要传递到
cv2.filter2D()
的内核参数(
horizontalSobelMtx
)的数据类型。但是,我还没有找到任何关于
cv2.filter2D()
内核数据类型的文档

因此,以下是我的问题:

1)
cv2.filter2D(…,kernel,…)
对于
kernel
参数来说应该是什么数据类型


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

我也有同样的问题,但我相信我有一个部分答案。基本上,您需要对内核进行称重。过滤算法的工作方式是,它接受你的过滤器,将其相乘,然后将所有值相加,并将它们用作新值。关键是添加部分。添加8个不同的值(一些是负数,一些是正数)通常会产生一个较大的数字,并且显示为黑色(或者在我的例子中为全白色)。 因此,你必须对增加的部分进行补偿。将内核中的所有值除以内核的大小/面积。请参见示例并记下该行

  kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);
他们把所有的东西都除以内核大小的平方

我自己,我这样做了,它有帮助(有些东西显示了),但它被洗掉了,所以我通过在代码中添加以下内容找到了我的完美体重:

 int d2weight = 1;
 //... start loop, make your Mat kernel
 kernel = kernel / d2weight;  //put right before your filter2d() call
 createTrackbar("kernel", "kernel", &d2weight, 255, NULL);

在d2weight=140左右拨弄条,我的图片“弹出”到视图中。

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

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

我运行了您的代码,并得到了正确的结果。您是否运行了注释为“自定义Sobel代码(输出全黑图像)”的代码段??我也得到了正确的结果。@Froyo是用于
#OpenCV的Sobel代码(输出好看的渐变)
代码段还是
#自定义Sobel代码(输出全黑图像)的代码段
code?gradientX.png和gradientX_customSobel.png都是正确的。
 int d2weight = 1;
 //... start loop, make your Mat kernel
 kernel = kernel / d2weight;  //put right before your filter2d() call
 createTrackbar("kernel", "kernel", &d2weight, 255, NULL);
horizontalSobelMtx = [[-1,0,1],[-2,0,2],[-1,0,1]]
horizontalSobelMtx = numpy.asanyarray(horizontalSobelMtx, np.float32)