C ++图像处理:均匀的平滑操作使图像更暗

时间:2019-02-23 15:17:31

标签: c++ image image-processing smoothing noise-reduction

我正在尝试通过在C ++中创建2D均匀平滑算法来减少图像中的噪点。我为每个像素使用的函数计算平方奇数窗内相邻像素的平均值,并将其用作新值。

但是,每当我运行代码时,新图像中的像素就会变暗(像素值255 =白色,0 =黑色)。这是获取新像素值的功能:

int utility::windowAverage (image &src, int x, int y, int window_size)
{
    int sum = 0;
    int avg;
    for(int i = x-(window_size/2); i < x+(window_size/2);++i)
    {
        for(int j = y-(window_size/2); j < y+(window_size/2);++j)
        {
            sum += src.getPixel(i,j);
        }
    }

    avg = sum/(window_size*window_size);
    return avg;
}

参数image &src是源图像,函数src.getPixel(i,j)返回0到255之间的整数,表示指定坐标(i,j)处像素的亮度。

我正在.pgm格式的灰度图像上运行代码。

如何在保持相同亮度的同时平滑图像?

1 个答案:

答案 0 :(得分:1)

问题是,您实际上并未在窗口尺寸为windows_size * windows_size的像素中添加像素,但是在计算sum时,缺少了每个尺寸的最后一个像素。

您可以通过在两个for循环中使用<=而不是<来解决此问题。


示例window_size = 3x=0y=0出了什么问题:

您的for循环中的整数除以2为底,这意味着您的循环将变为for (int i=-1; i < 1; i++)。显然,这只会沿给定方向在(两个)像素-1和0上循环,但您仍需除以window_size的3,从而使图像更暗(在这种情况下,如果图像恒定,则为三分之一)颜色值)。