C 框模糊边有问题吗

C 框模糊边有问题吗,c,image-processing,computer-vision,filtering,blur,C,Image Processing,Computer Vision,Filtering,Blur,我是一个新手爱好者,尝试编程一个框模糊,我在边缘方面遇到了麻烦。我希望有人能发现错误 边缘是黑色的,我认为这是因为边界没有被正确反射。我确信这已经和一个固定大小的内核讨论过了,但是我使用的是一个可变大小的内核 我正在使用另一篇文章中的代码-- 然而,我只是不理解反射边界部分 我真的不在乎优化与否,也不在乎其他内核形状,长方体形状就可以了 代码是 {// code from https://stackoverflow.com/questions/7860575/optimized

我是一个新手爱好者,尝试编程一个框模糊,我在边缘方面遇到了麻烦。我希望有人能发现错误

边缘是黑色的,我认为这是因为边界没有被正确反射。我确信这已经和一个固定大小的内核讨论过了,但是我使用的是一个可变大小的内核

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

然而,我只是不理解反射边界部分

我真的不在乎优化与否,也不在乎其他内核形状,长方体形状就可以了

代码是

        {// 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);

                    }
                }
        }
{//code fromhttps://stackoverflow.com/questions/7860575/optimized-float-blur-variations
//--------------------------------------
int图像宽度;
int图像_高度;
整数比例=0;
整数权重=(半径*2)+1;
int-kernel_X=0;
int-kernel_Y=0;
//--------------------------------------
浮动总和=0.0;
int kernel_width=radius;//将两者设置为相同,以使内核为正方形
int kernel_height=radius;//将两者设置为相同,以使内核为正方形
//水平的
对于(iy=0;iy--------------边框代码不反映边缘帮助!!
//将手表包裹在图像的左侧并生成黑色条
for(kernel_X=(image_width-kernel_width);kernel_X=0&&kernel\u X=0)
sum-=tmp[(iy-内核高度-1)*图像宽度+ix];
//添加像素输入窗口
if(iy+内核高度<图像高度)
sum+=tmp[(iy+内核高度)*图像宽度+ix];
其他的
sum+=tmp[(iy+内核高度-图像高度)*图像宽度+ix];
dst[(比例*图像宽度*图像高度)+(iy*图像宽度+ix)]=(总和/重量);
}
}
}
我非常感谢你在这方面的帮助

谢谢 约翰

编辑这里有一些链接的图像边缘的例子

具有适当框模糊的图像

使用上述代码的图像边缘不正确(请注意,顶部和左侧边缘上的黑色条,底部和右侧也不完全正确)

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

您可能希望将此应用到社区中以获得更好的答案。您能否发布一些图像以更好地理解确切的问题?另外,您可能需要查找汇总面积表。它们可以更快,有时更容易实现。