【发布时间】:2016-10-09 11:39:02
【问题描述】:
我正在尝试将 12 位 RGGB 颜色值转换为 8 位 RGGB 颜色值,但使用我当前的方法会产生奇怪的结果。
从逻辑上讲,我认为简单地将 12 位 RGGB 划分为 8 位 RGGB 就可以了,而且非常简单:
// raw_color_array contains R,G1,G2,B in a bayer pattern with each element
// ranging from 0 to 4096
for(int i = 0; i < array_size; i++)
{
raw_color_array[i] /= 16; // 4096 becomes 256 and so on
}
然而,在实践中这实际上是行不通的。例如,给定一张带有水和一块冰的小图像,您可以看到转换中实际发生的情况(最右边的图像)。
为什么会这样?以及如何在左侧获得相同(或接近)的图像,但改为 8 位值?谢谢!
编辑:离开@MSalters 的回答,我得到了质量更好的图像,但颜色仍然严重偏斜。我可以寻找哪些资源来将 12 位数据转换为 8 位数据而不会大幅降低质量?
【问题讨论】:
-
您是否尝试过在通道上绘制直方图,看看您是否应该支持某些范围,而不是广泛开放的除以 16 的方法?
-
你调试观察过
raw_color_array的值吗?他们是你所期望的吗?raw_color_array的数据类型是什么?你有舍入错误吗? -
@ChrisO 实际上,我尝试的第一次迭代是查看直方图并猜测标准化方案。它产生了几乎相同的结果,但它不是一个可扩展的解决方案(例如,我需要为 14 位彩色图像重新执行此过程等等)。想知道这是否可能不带眼睛。
-
因为您想将数据转换为不同的大小。您必须接受,当目标数据大小较小(从 12 位到 8 位)时,它会丢失一些数据。现在,要在转换后获得最接近的颜色强度匹配,您需要计算 12 位与目标转换之间的比率。我已经在答案中提出了公式。
-
您说“RGB”,但代码显示“RGGB”。这可能是故意的(与“拜耳模式”结合使用是有意义的),但它可能很好地解释了为什么您的结果看起来偏绿。
标签: c++ image image-processing colors