デフォーカスボケをシミュレートしたいと思いますが、画像内の各ピクセルの強度は、ピクセルが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;
}
私は本当にありがとう、ありがとう!