Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python filter2D OpenCV函数c++; 我注意到C++中的过滤器2D的OpenCV实现和相应内核的直接实现之间的差异。我已看过以下问题:_Python_C++_Opencv - Fatal编程技术网

Python filter2D OpenCV函数c++; 我注意到C++中的过滤器2D的OpenCV实现和相应内核的直接实现之间的差异。我已看过以下问题:

Python filter2D OpenCV函数c++; 我注意到C++中的过滤器2D的OpenCV实现和相应内核的直接实现之间的差异。我已看过以下问题:,python,c++,opencv,Python,C++,Opencv,该问题的作者试图获得filter2D函数的有效实现。他声称使用标准化版本的过滤器可以产生正确的结果。我检验了他的假设,发现只有当所有系数都为正时,归一化才能给出正确的答案。因此,可以使用filter2D函数成功实现平均滤波器。[我们仍然必须规范化内核] 然而,对于具有负系数的滤波器,例如Sobel、Laplacian和任何边缘检测滤波器,情况并非如此。这个问题的作者遇到了和我一样的问题 上面提到的用户回答了链接的问题。他声称,如果内核的系数之和等于零,filter2D可能会修改其实现。是这样吗

该问题的作者试图获得filter2D函数的有效实现。他声称使用标准化版本的过滤器可以产生正确的结果。我检验了他的假设,发现只有当所有系数都为正时,归一化才能给出正确的答案。因此,可以使用filter2D函数成功实现平均滤波器。[我们仍然必须规范化内核]

然而,对于具有负系数的滤波器,例如Sobel、Laplacian和任何边缘检测滤波器,情况并非如此。这个问题的作者遇到了和我一样的问题


上面提到的用户回答了链接的问题。他声称,如果内核的系数之和等于零,filter2D可能会修改其实现。是这样吗?为什么C+中filter2D的实现与直接实现的结果不同?我已经在Python中检查了Field2D,并且C++中相应内核的直接实现也产生了相同的结果。p> 这主要是因为缩放和溢出问题。 filter2D的文档没有提到(至少我没有找到)溢出值是否被适当地剪裁或缩放到最小-最大范围。 这在定向滤波器的情况下更为重要,在定向滤波器中,系数为正和负,并且在代数运算之后 上面链接上显示的函数“myfilter2D”未缩放到最小-最大范围(应为这种情况)

如果您可以发布示例代码,那么就更容易提供帮助

我的建议是将矩阵转换为浮点(通过缩放)并执行代数运算,因为这样可以保留结果值,并且值不会因溢出或饱和而丢失。 IM2DUUBLE()->“执行代数运算”->im2uchar()用于显示

void im2uchar( Mat & src, Mat  & dest){ 
  double minVal, maxVal;
  minMaxLoc(src, &minVal, &maxVal); //find minimum and maximum intensities
  src.convertTo(dest, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));
  }

void im2float( Mat  & src, Mat  & dest){ 
  double minVal, maxVal;
  minMaxLoc(src, &minVal, &maxVal); //find minimum and maximum intensities
  src.convertTo(dest, CV_32F, 1.0/(maxVal - minVal), -minVal * 1.0/(maxVal - minVal));
  }