gpt4 book ai didi

c++ - Opencv - filter2D() 方法实际上是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 23:01:22 37 4
gpt4 key购买 nike

我确实查找了 Filter2D 的源代码,但找不到。 Visual c++ 也不能。这里有filter2D算法的专家吗?我知道how it's supposed to work但不是它实际上是如何工作的。我做了自己的filter2d()函数来测试东西,结果与opencvs filter2D()有很大的不同。这是我的代码:

Mat myfilter2d(Mat input, Mat filter){

Mat dst = input.clone();
cout << " filter data successfully found. Rows:" << filter.rows << " cols:" << filter.cols << " channels:" << filter.channels() << "\n";
cout << " input data successfully found. Rows:" << input.rows << " cols:" << input.cols << " channels:" << input.channels() << "\n";

for (int i = 0-(filter.rows/2);i<input.rows-(filter.rows/2);i++){
for (int j = 0-(filter.cols/2);j<input.cols-(filter.cols/2);j++){ //adding k and l to i and j will make up the difference and allow us to process the whole image
float filtertotal = 0;
for (int k = 0; k < filter.rows;k++){
for (int l = 0; l < filter.rows;l++){
if(i+k >= 0 && i+k < input.rows && j+l >= 0 && j+l < input.cols){ //don't try to process pixels off the endge of the map
float a = input.at<uchar>(i+k,j+l);
float b = filter.at<float>(k,l);
float product = a * b;
filtertotal += product;
}
}
}
//filter all proccessed for this pixel, write it to dst
st.at<uchar>(i+(filter.rows/2),j+(filter.cols/2)) = filtertotal;

}
}
return dst;
}

有人发现我的实现有什么问题吗? (除了慢)

这是我的执行:

  cvtColor(src,src_grey,CV_BGR2GRAY);
Mat dst = myfilter2d(src_grey,filter);
imshow("myfilter2d",dst);
filter2D(src_grey,dst2,-1,filter);
imshow("filter2d",dst2);

这是我的内核:

float megapixelarray[basesize][basesize] = {
{1,1,-1,1,1},
{1,1,-1,1,1},
{1,1,1,1,1},
{1,1,-1,1,1},
{1,1,-1,1,1}
};

还有 here are the (substantially different) results:

有什么想法吗?

编辑:感谢 Brians 的回答,我添加了以下代码:

//normalize the kernel so its sum = 1
Scalar mysum = sum(dst);
dst = dst / mysum[0]; //make sure its not 0
dst = dst * -1; //show negetive

filter2d 效果更好。某些过滤器提供完全匹配,而其他过滤器,如 Sobel,fail miserably.

我正在接近实际的算法,但还没有。其他人有什么想法吗?

最佳答案

我认为问题可能是规模问题:如果您的输入图像是 8 位图像,大多数时候卷积会产生一个超出最大值 255 的值。

在您的实现中,您似乎获得了环绕值,但大多数 OpenCV 函数通过限制为最大值(或最小值)来处理溢出。这就解释了为什么 OpenCV 函数的大部分输出都是白色的,以及为什么你的输出中也会出现同心形状。

为了解决这个问题,通过将每个值除以过滤器的总和来规范化您的 megapixelarray 过滤器(即确保过滤器值的总和为 1):

例如,代替这个过滤器(sum = 10):

1 1 1
1 2 1
1 1 1

试试这个过滤器(总和 = 1):

0.1 0.1 0.1
0.1 0.2 0.1
0.1 0.1 0.1

关于c++ - Opencv - filter2D() 方法实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13981699/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com