我想在c中从头开始实现高斯模糊。我有一个程序创建一个结构并加载一个.bmp文件,创建一个高斯模糊滤镜(前两个for-loops),然后将高度,宽度和实际像素信息发送给另一个应用滤镜的函数到图像(下面的4个嵌套for循环)。应用后,它会输出修改后的.bmp文件。目前它稍微有效,但它不能一直工作。我无法调整模糊的强度(所有模糊的水平看起来都一样)。它也似乎错过了图像周围像素的外边缘。高斯模糊实现不完全工作
当我创建过滤器,我使用:
double sigma = 10.0;
double r, s = 2.0 * sigma * sigma;
double sum = 0.0;
但它看起来相同的适马是否为1,10,100 - 我的理解是,它应该得到更加模糊与更大的西格玛。
创建过滤器:
// generate 5x5 kernel
for (int x = -2; x <= 2; x++)
{
for(int y = -2; y <= 2; y++)
{
r = sqrt(x*x + y*y);
gKernel[x+2][y+2] = (exp(-(r*r)/s))/(M_PI * s);
sum += gKernel[x + 2][y + 2];
}
}
// normalize the Kernel
for(int i = 0; i < 5; ++i)
for(int j = 0; j < 5; ++j)
gKernel[i][j] /= sum;
,然后应用过滤器:
for (i = 1; i < bmp->height - 1; i++)
{
for (j = 1; j < bmp->width - 1; j++)
{
sum = 0.0;
for (p = 0; p < 5; p++)
{
for (q = 0; q < 5; q++)
{
sum += bmp->pixels[(i + p) * bmp->width + j + q] * gKernel[p][q];
}
}
bmp->pixels[(i - 1) * (bmp->width) + j] = (unsigned char) sum ;
}
}
任何帮助,非常感谢!感谢您的时间。
欢迎来到Stack Overflow。遵循SO约定使您更有可能获得帮助。请阅读如何提供一个MCVE。 https://stackoverflow.com/help/mcve – Gene
当您增加西格玛时,是否增加了您的过滤器内核大小? –
否 - 你的意思是为x的西格玛生成一个x x内核,然后x + 5的x + 5内核生成一个y + 5的西格玛?我只测试了5的内核大小5.当我增加西格玛时,我应该增加这个值吗? – kab403