10 位像素转换为 RGB

信息处理 图像处理 图片
2022-02-21 18:18:45

我有一台相机,它为我提供 10 位数据的原始二进制数据。它遵循拜耳模式 RGGB,每个像素都使用 16 位块保存。我几乎可以成功地对图像进行去马赛克。

问题

RGB 图像看起来几乎是全黑的。如果我将原始数据乘以 64,RGB 图像看起来更好,但更绿。整体强度非常低。相机提供商有相机的实时视图,它在两个方面看起来都好得多。

我猜

由于 10 位被保存到 16 位块中,因此我使用的工具假定为 16 位深度(至少 Matlab 和 OpenCV 确实如此)。为了弥补这一点,我将原始数据乘以 64(左移 6 位)。但仍然不够。如果我乘以 128,一些像素会饱和,然后图像看起来很奇怪。

我试过的

使用 Matlab 图像处理工具箱、Python 颜色去马赛克包和 OpenCV 函数,我得到了相同的结果,但它们与实时可视化不匹配。

更新 我分析了供应商工具的直方图,以及来自 OpenCV 的直方图。我不确定,但有趣的是没有高于 255 的值。但是,在我从他们的软件记录的原始数据中,有很多高于 255 的值,但与低于 255 的值相比没有。因此,如果我用 max 剪辑图像值为 255,最终结果看起来非常相似!

问题

  • 还有什么我可以验证的吗?我认为这是我的问题,因为这三个工具给出了相同的结果。
  • 有没有更好的方法来处理 10 位像素转换为 16 位?
  • 我在更新中发现的内容有什么意义吗?似乎这两个额外的位除了噪声之外什么都没有!

任何帮助表示赞赏。很抱歉没有提供数据或图片(公司隐私)。

谢谢!

1个回答

您从相机获得的原始数据在相机 CFA 滤镜所跨越的色彩空间中几乎是线性的。您拥有的 8 位/样本监视器假定图像是经过伽马压缩的,很可能在 sRGB 色彩空间内。这两个色彩空间是不同的,因此您需要以某种方式在两者之间进行映射。了解这一点,让我们解决您的每个问题:

RGB 图像看起来几乎是全黑的。

最大 10 位值为 1023,最大 16 位值为 65535。要将 10 位线性转换为 16 位线性,请乘以 65535./1023 并四舍五入到最接近的整数。或者,直接使用浮点可能更容易,因此只需除以 1023 即可将数据映射到 [0,1] 范围。

RGB 图像看起来......相当绿色

相机传感器通常对绿色更敏感,因此绿色响应高于红色和蓝色,整体呈现绿色。要在已知色彩空间(例如显示器使用的 ITU-R BT.709 原色)内对入射光进行物理上正确的测量,您需要计算出从相机色彩空间到首选色彩空间的色彩转换矩阵。有不同的方法可以做到这一点:获取颜色校准图表,联系传感器制造商,或使用其他方式(如单色仪)测量精确的光谱响应。

话虽如此,如果您不寻求物理上正确的测量,而只是为了获得足够好的图片,您可能会跳过上述校准步骤,而只执行白平衡步骤:找到一个应该是灰色的物体在帧中并将每个像素除以该对象的 RGB,从而消除绿色色调。这本身,没有颜色转换,不会完全再现颜色。

整体强度很低

这是由于线性与伽马的差异。您在具有高位的线性色彩空间中进行所有数学运算,最后一步,将其转换为 8 位 sRGB 以进行显示。有关确切公式,请参见sRGB