c++ - C++图像处理:统一平滑操作使图像更暗
问题描述
我试图通过在 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 格式的灰度图像上运行代码。
如何在保持相同亮度的同时平滑图像?
解决方案
问题是您实际上并没有在尺寸为 windows_size*windows_size 的窗口中添加像素,而是在计算时缺少每个尺寸中的最后一个像素sum
。
您可以通过在两个 for 循环中使用<=
而不是来解决此问题。<
window_size = 3
和x=0
and出了什么问题的例子y=0
:
for 循环中的整数除以 2 是底数,这意味着您的循环将变为for (int i=-1; i < 1; i++)
. 这显然只在给定方向上循环(两个)像素 -1 和 0,但您仍然除以window_size
3,这使得图像更暗(在这种情况下,如果它具有恒定的颜色值,则为三分之一)。
推荐阅读
- git - Git for Windows/WSL2/VS Code 的非常奇怪的问题
- django - 如何在 Django 中呈现外键关系
- azure - 无法使用已装载存储的 Linux 部署 Azure 应用服务的 ARM 模板
- visual-studio-2019 - 在 VS2019 中看不到导入配置文件选项
- android - Windows 上的 adb 别名屏幕截图,Git bash 不起作用
- java - 如何管理 Flyway 的变化发展?
- binary-search-tree - 我想在以下二叉搜索树中找到总和为 12 的所有对
- visual-studio-2019 - Visual Studio 2019 中缺少“在 Microsoft Excel 中打开选择”选项
- php - 使用 Laravel 进行递归更新
- python - 在主窗口工具栏中嵌入带有自定义导航工具栏操作的 matplotlib