C++图像处理:均匀平滑操作使图像变暗
C++ Image Processing: Uniform Smoothing Operation Makes Image Darker
我试图通过在 C++ 中创建二维均匀平滑算法来减少图像中的噪声。我为每个像素使用的函数计算奇数 window 内相邻像素的平均值,并将其用作新值。
但是,每当我 运行 代码时,新图像中的像素就会变暗(像素值为 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)
returns一个0到255的整数,表示指定坐标(i,j)处像素点的亮度).
我正在 运行将代码置于 .pgm 格式的灰度图像上。
如何在保持相同亮度的同时平滑图像?
问题是您实际上并没有在 window 中添加维度为 windows_size*windows_size 的像素,但是当您在每个维度中缺少最后一个像素时计算 sum
.
您可以通过在两个 for 循环中使用 <=
而不是 <
来解决此问题。
window_size = 3
和 x=0
和 y=0
出错的示例:
您的 for 循环中除以 2 的整数被取满,这意味着您的循环将变为 for (int i=-1; i < 1; i++)
。这显然只在给定方向上循环遍历(两个)像素 -1 和 0,但你仍然除以 3 的完整 window_size
,这会使图像变暗(在这种情况下,如果它具有常数,则为三分之一)颜色值)。
我试图通过在 C++ 中创建二维均匀平滑算法来减少图像中的噪声。我为每个像素使用的函数计算奇数 window 内相邻像素的平均值,并将其用作新值。
但是,每当我 运行 代码时,新图像中的像素就会变暗(像素值为 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)
returns一个0到255的整数,表示指定坐标(i,j)处像素点的亮度).
我正在 运行将代码置于 .pgm 格式的灰度图像上。
如何在保持相同亮度的同时平滑图像?
问题是您实际上并没有在 window 中添加维度为 windows_size*windows_size 的像素,但是当您在每个维度中缺少最后一个像素时计算 sum
.
您可以通过在两个 for 循环中使用 <=
而不是 <
来解决此问题。
window_size = 3
和 x=0
和 y=0
出错的示例:
您的 for 循环中除以 2 的整数被取满,这意味着您的循环将变为 for (int i=-1; i < 1; i++)
。这显然只在给定方向上循环遍历(两个)像素 -1 和 0,但你仍然除以 3 的完整 window_size
,这会使图像变暗(在这种情况下,如果它具有常数,则为三分之一)颜色值)。