2011-10-18 15 views
0

デフォーカスボケをシミュレートしたいと思いますが、画像内の各ピクセルの強度は、ピクセルがsqrt(x^2 + 2)以内にある場合、指定された半径rについて1 /(pi * r^2) y^2)、そうでない場合は0 (より詳しい説明のためにコードを参照)カスタムカーネルによるOpenCVデフォーカスのぼかし?

これは、ぼかし/畳み込みカーネルを円形にします。ここでは、これまでに私のコードですが、なぜこれが起こっている私は本当に理解することはできません testimage http://www.bilderkiste.org/show/original/1131895735815/test_out.jpg

:OpenCVのちょうど「pixelizes」私のイメージのエッジ:私はOpenCVのBUでこれを実行しようとしました には運がなかった

//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; 
} 

私は本当にありがとう、ありがとう!

答えて

0

KERNELLENGTH/2 == 1とカーネルが3x3のもので、適切なデフォーカスディスクとは言わないので、問題は#define KERNELLENGTH 3にあるようです。

#define KERNELLENGTH 10

関連する問題