【问题标题】:C++ Image Processing: Uniform Smoothing Operation Makes Image DarkerC++ 图像处理:统一平滑操作使图像更暗
【发布时间】:2019-07-17 11:44:26
【问题描述】:

我正在尝试通过在 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 &amp;src为源图像,函数src.getPixel(i,j)返回一个0到255之间的整数,表示指定坐标(i,j)处像素的亮度。

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

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

【问题讨论】:

  • 您的ints 很可能溢出。考虑使用size_t 或类似的值。

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


【解决方案1】:

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

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


示例说明 window_size = 3x=0y=0 的问题:

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

【讨论】:

  • 这似乎已经解决了这个问题。非常感谢!
猜你喜欢
  • 2014-05-07
  • 1970-01-01
  • 2015-06-23
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
相关资源
最近更新 更多