作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想模拟散焦模糊,图像中每个像素的强度为:
如果像素在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
?
关于opencv - 使用自定义内核的OpenCV散焦模糊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811114/
我是一名优秀的程序员,十分优秀!