OpenCV-filter2D()方法实际上如何工作?
c++
computer-vision
opencv
9
0

我确实在寻找Filter2D的源代码,但找不到它。 Visual c ++也不行。这里有关于filter2D算法的专家吗?我知道它应该如何工作,但实际上却不知道。我制作了自己的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}
            };

这是(基本上不同的)结果:

有什么想法吗?

编辑:感谢布莱恩斯回答我添加了此代码:

//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) 会惨败。

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

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

我认为这个问题可能是规模问题之一:如果您输入的图像是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
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题