我注意到C++中filter2D的OpenCV实现与相应内核的直接实现之间的区别。我已阅读以下问题:
Opencv - how does the filter2D() method actually work?
该问题的作者试图获得filter2D函数的有效实现。他声称使用过滤器的标准化版本会产生正确的结果。我检验了他的假设,发现只有当所有系数都是正数时,归一化才能给出正确的答案。因此,可以使用filter2D函数成功实现平均滤波器。[我们仍然必须对内核进行标准化]。
但是,对于具有负系数的滤波器(例如Sobel,Laplacian和任何边缘检测滤波器)而言,情况并非如此。该问题的作者遇到了与我相同的问题。
https://stackoverflow.com/users/2669614/bovaz
上面提到的用户回答了链接的问题。他声称,如果内核系数之和等于零,filter2D可能会修改其实现。是这样吗为什么C +中的filter2D实现与直接实现会产生不同的结果?我已经检查了Python中的filter2D和C++中相应内核的直接实现是否会产生相同的结果。
最佳答案
这主要是由于缩放和溢出问题。
filter2D的文档没有提及(至少没有找到)溢出值是否被裁剪或缩放到了最小-最大范围。
在定向滤波器的情况下,这一点尤为重要,在定向滤波器中,系数为正和负,且在代数之后
上面链接中显示的功能“myfilter2D”不能缩放到应该的最小-最大范围。
如果您可以发布示例代码,则将更容易获得帮助。
我的建议是将矩阵转换为浮点数(按比例缩放)并执行代数运算,因为这倾向于保留结果值,并且不会因溢出或饱和而丢失值。
im2double()->“执行代数运算”-> 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));
}
关于python - filter2D OpenCV函数c++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41934093/