gpt4 book ai didi

c - 框模糊边缘遇到问题

转载 作者:行者123 更新时间:2023-11-30 14:26:43 26 4
gpt4 key购买 nike

我是一名新手爱好者,试图对盒子模糊进行编程,但我在边缘方面遇到了麻烦。我希望有人能够发现这个错误。

边缘是黑色的,我假设这是因为边框没有正确反射。我确信这已经通过固定大小的内核进行了讨论,但我使用的是可变大小的内核。

我正在使用在另一篇文章中找到的代码--

Optimized float Blur variations

但是我只是不明白反射边框部分。

我并不关心是否优化,也不关心其他内核形状,盒子形状就可以了。

代码是

        {// code from https://stackoverflow.com/questions/7860575/optimized-float-blur-variations

//--------------------------------------
int image_width ;
int image_height ;
int scale = 0;

int weight = (radius * 2) + 1;

int kernel_X = 0;
int kernel_Y = 0;

//--------------------------------------
float sum = 0.0;

int kernel_width = radius;//set both to the same to make the kernel square
int kernel_height = radius;//set both to the same to make the kernel square


// HORIZONTAL
for(iy = 0; iy < image_height ;iy++)
{
sum = 0.0;

// Process entire window for first pixel (including wrap-around edge)
for (kernel_X = 0; kernel_X <= kernel_width; kernel_X++)
{
if (kernel_X >= 0 && kernel_X < image_width)
//sum += src[iy * image_width ];
sum += src[iy * image_width + kernel_X];
}

//>-------------- border code does not reflect edges HELP!!
// Wrap watch for left side of image & resulting black bar
for (kernel_X = (image_width - kernel_width); kernel_X < image_width; kernel_X++)
{
// if (kernel_X >= 0 && kernel_X < image_width)// HORIZONTAL width = horizontal = X
// sum += src[iy * kernel_width + image_width ];//<-------------------enter tester formula here
// sum += src[iy + ix * image_width + kernel_X];//<-------------------FAIL
// sum += src[iy * kernel_width + image_width ];//<-------------------streaky
}



// Store first window
tmp[iy * image_width] = (sum / weight );

for(ix = 1; ix < image_width; ix++)
{
// Subtract pixel leaving window
if (ix - kernel_width - 1 >= 0)
sum -= src[iy * image_width + ix - kernel_width - 1];

// Add pixel entering window
if (ix + kernel_width < image_width)
sum += src[iy * image_width + ix + kernel_width];
else
sum += src[iy * image_width + ix + kernel_width - image_width];

tmp[iy * image_width + ix] = (sum / weight);//just for testing
}
}


// VERTICAL
for(ix = 0; ix < image_width; ix++)
{
sum = 0.0;

// Process entire window for first pixel
for (kernel_Y = 0; kernel_Y <= kernel_height; kernel_Y++)
{
if (kernel_Y >= 0 && kernel_Y < image_height)
sum += tmp[kernel_Y * image_width + ix];
}
//>-------------- border code does not reflect edges HELP!!
// Wrap watch for top side of image & resulting black bar
for (kernel_Y = image_height-kernel_height; kernel_Y < kernel_height; kernel_Y++)
{
//if (kernel_Y >= 0 && kernel_Y < image_height)
// sum += tmp[(iy + kernel_height - image_height) * image_width + ix];
}
for(iy=1;iy< image_height ;iy++)
{
// Subtract pixel leaving window
if (iy-kernel_height-1 >= 0)
sum -= tmp[(iy - kernel_height-1) * image_width + ix];

// Add pixel entering window
if (iy + kernel_height < image_height)
sum += tmp[(iy + kernel_height) * image_width + ix];
else
sum += tmp[(iy + kernel_height - image_height) * image_width + ix];

dst[ (scale * image_width * image_height) + (iy * image_width + ix) ] = (sum / weight);

}
}
}

非常感谢您对此提供的任何帮助。

谢谢约翰

这里编辑一些边缘图像示例的链接。

具有适当框模糊的图像 http://img687.imageshack.us/img687/931/standardboxblur.jpg

使用上述代码,图像边缘不正确(注意顶部和左侧边缘、底部和右侧的黑条也不太正确) http://img202.imageshack.us/img202/5137/boxblurbadedges.jpg

最佳答案

如果将采样放入一个单独的例程中,给定 x 和 y 坐标,则返回像素值,这可能是最简单的。然后,您可以进行一些检查,并将 x 和 y 值分别限制在 0 和宽度以及 0 和高度之间。然后您可以安全地传入负值或大于宽度或高度的值。它还允许您更轻松地尝试其他方案,例如反射、夹紧到一种颜色、外推等。只需将夹紧的采样函数替换为具有其他行为的采样函数即可。

关于c - 框模糊边缘遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8701609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com