gpt4 book ai didi

c++ - 在图像上应用均值滤波器时出现小的颜色缺陷

转载 作者:行者123 更新时间:2023-11-30 03:40:13 25 4
gpt4 key购买 nike

我一直在尝试做一个对图像应用均值过滤器的程序,我认为我已经接近正确地做到这一点,但图像中仍然存在小缺陷。例如:

原始赛车:http://s72.photobucket.com/user/john_smith140/media/gp4_zpstafhejk5.jpg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=2

原始三角形:http://s72.photobucket.com/user/john_smith140/media/input_zpsz2cfhrc7.jpeg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=3

retrofit 赛车:http://s72.photobucket.com/user/john_smith140/media/racing_zpsmzmawjml.jpeg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=0

修改后的三角形:http://s72.photobucket.com/user/john_smith140/media/triangles_zpsaretjfid.jpeg.html?filters[user]=139318132&filters[recent]=1&sort=1&o=1

黑底白点,原文:http://s72.photobucket.com/user/john_smith140/media/black%20background%20white%20dots_zpsuofaagnl.jpg.html?sort=3&o=2

黑底白点,相同数组:http://s72.photobucket.com/user/john_smith140/media/one%20array_zpswteno2eb.jpg.html?sort=3&o=1

黑底白点,不同排列:http://s72.photobucket.com/user/john_smith140/media/two%20array_zpskbyjg97o.jpg.html?sort=3&o=0

我可以考虑造成缺陷的两个原因。一种是算法本身,另一种是在将 char 转换为 float 然后再将 float 再次转换为 char 的过程中。

char转float是必须的,因为ifstream的读取函数读取的是char,然后我需要将每个乘以1/9,所以需要是 float 。然后转换回 char,以便写入函数可以将其写回。

算法的一些解释。我从第二行的第二个像素开始计算颜色值,然后一直计算到倒数第二行的倒数第二个像素。那是因为我使用的是 3x3 的内核,这样我就不会超出图像的限制(以及我存储它的 char 数组的限制)。对于 1024x768 的图像,其大小为 1024x768*3(3 个颜色分量)。所以它从位置开始:bitsPerPixel * image_width + bitsPerPixel 或 3*1024+ 3 = 4099,即第 2° 行的第 2° 像素。然后它将计算平均值,直到 2° 最后一行的 2° 最后一个像素应该是:imageSize - row_size - bitsPerPixel 或 (1024*768-3) - 1024*3 - 3。在区间内,它会计算char数组中每个位置的值,也就是说一个像素点的每个颜色 channel 的值都会被周围像素点的颜色 channel 计算出来。这是代码:

int size2 = bpp*width;
float a1_9 = (1.0f/9.0f);
float tmp;
for (int i=size2+bpp; i<size-size2-bpp; i++) {
tmp = a1_9 * ((float) image [i-size2-bpp] + (float) image [i-size2] + (float) image [i-size2+bpp] + (float) image [i-bpp] + (float) image [i] + (float) image [i+bpp] + (float)image [i+size2-bpp] + (float) image [i+size2] + (float) image [i+size2+bpp]);
image [i] = char (tmp);
float temp = (float) image [i];
}

我打印了赛车屏幕截图的一次交互值,对应于位置一百万的值并得到了这个:

Image values are: -56 -57 -57 9 -43 -41 108 108 109 
tmp it is: 8.88889
temp it is: 8

这些值乍一看似乎是正确的(按手头的平均值计算),所以我不太清楚哪里出了问题。任何帮助将不胜感激。

最佳答案

2 关于你的算法的想法:

1.) 您正在使用 RGB 色彩空间?那为什么你的图像值是负的?您也不必转换为 float 。只需将整数值相加并将其除以 9。这样会快得多,最后您无论如何都将其转换回 char,因此结果应该相同。

2.) 你在每个迭代步骤中覆盖你的图像,这意味着在过滤器模式中:

-------
|1|2|3|
-------
|4|5|6|
-------
|7|8|9|
-------

值 1、2、3 和 4 已经被平滑,5 是从 5 个未平滑像素和 4 个平滑像素计算得出的。我建议创建一个新的空白图像并将结果(临时)存储在新图像中,同时从原始图像读取 - 即不要尝试使用输出图像处理 “就地”与输入图像相同。

关于c++ - 在图像上应用均值滤波器时出现小的颜色缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38205177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com