opencv - 使用自定义内核的OpenCV散焦模糊?

我想模拟散焦模糊,图像中每个像素的强度为:

如果像素在sqrt(x ^ 2 + y ^ 2)内,则给定半径r为1 /(pi * r ^ 2),否则为0
(请参阅代码以获得更好的解释)

这给出了圆形的模糊/卷积核。
我尝试在opencv中做到这一点,但是没有运气:opencv只是“像素化”了我图像的边缘:
testimage http://www.bilderkiste.org/show/original/1131895735815/test_out.jpg

我无法弄清楚为什么会这样,到目前为止,这是我的代码:

//includes. then:
using namespace std;
#define KERNELLENGTH 3
#define PI 3.14159265
int main() {
    IplImage *src = 0;
    IplImage *dst = 0;
    src = cvLoadImage("test.bmp"); //create image matrixes..
    dst = cvLoadImage("test.bmp"); //
    CvMat *filter;
    double kernel[KERNELLENGTH * KERNELLENGTH]; //create an appropriate kernel
    int r = KERNELLENGTH / 2; //calculate the radius
    double value = 1 / (PI * KERNELLENGTH * KERNELLENGTH / (4 * r)); //calculate the defocus blur value
    cout << "Kernel:" << "\n";
    for (int x = 0; x < KERNELLENGTH; x++) //calculate kernel (seems to work right!)
    {
        for (int y = 0; y < KERNELLENGTH; y++) {
            if (sqrt((x - KERNELLENGTH / 2) * (x - KERNELLENGTH / 2) + (y
                    - KERNELLENGTH / 2) * (y - KERNELLENGTH / 2)) <= r) {
                kernel[y * 4 + x] = value; //Wert zuweisen
                cout << value << "\t";
            } else
                cout << 0 << "\t";
        }
        cout << "\n";
    }

    filter = cvCreateMatHeader(KERNELLENGTH, KERNELLENGTH, CV_32FC1);//create the filter
    cvSetData(filter, kernel, KERNELLENGTH * sizeof(kernel[0]));//link kernel and filter
    cvFilter2D(src, //convolve filter and src, save to dst
            dst, filter, cvPoint(-1, -1));

    cvSaveImage("test_out.bmp", dst); //save dst on disk

    cvReleaseImage(&src);
    cvReleaseImage(&dst);
    return 0;
}

非常感谢您的帮助,谢谢!

最佳答案

看来问题出在#define KERNELLENGTH 3中,因为您得到了KERNELLENGTH / 2 == 1且内核是3×3的东西,我不会将其称为适当的散焦磁盘。

您是否进行过测试#define KERNELLENGTH 10

https://stackoverflow.com/questions/7811114/

相关文章:

image-processing - 将向量与图像中的边缘进行关联

opencv - 如何使用OpenCV源代码进行调试

opencv - 即使在彩色视频图像的情况下,nchannel() 也始终返回 1

python - 如何转换图像以使投影图像与原始图像相同

eclipse - 为什么 OpenCV 中与 CvSeq 相关的一切都如此困惑?

opencv - 是否可以使用此过程将屏幕坐标转换为相机坐标?

visual-studio-2010 - 使用Visual Studio 2010和C的串行通信(用

android - android OpenCV-2.3.0 eclipse

opencv - 如何将OpenCV功能描述符标准化为整数比例?

android - OpenCV和Android