OpenCV расфокусировать размытие с помощью специального ядра?

Я хотел бы имитировать размытие расфокусировки, интенсивность для каждого пикселя изображения:

1/(pi*r^2) для заданного радиуса r, если пиксель находится в пределах sqrt(x^2+y^2) и 0, если нет (см. код для лучшего объяснения)

Это дает ядро ​​размытия/свертки круглой формы. Я пытался сделать это в opencv, но безуспешно: opencv просто «пикселизирует» края моего изображения: 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;
}

Я был бы очень признателен за помощь в этом, спасибо!


person Deadolus    schedule 18.10.2011    source источник


Ответы (1)


Кажется, проблема в #define KERNELLENGTH 3, так как вы получаете KERNELLENGTH / 2 == 1, а ядро ​​​​это что-то 3 на 3, что я бы не назвал правильным диском с расфокусировкой.

Вы тестировали, например. #define KERNELLENGTH 10?

person ansgri    schedule 22.08.2012