如何在 Matlab/ C++ 中组合具有不同增益的两个图像

How to combine two images with different gains in Matlab/ C++

本文关键字:图像 两个 Matlab C++ 组合      更新时间:2023-10-16

我有两张图像,都是从同一个探测器同时拍摄的。

两个图像都有11位分辨率(是的,它很奇怪,但这里就是这种情况)。两个图像之间的区别在于,一个图像放大了1倍,另一个图像放大了10倍。

如何拍摄这两个 11 位图像,并结合它们的像素值以获得单个 16 位图像? 基本上,这增加了最终图像的动态范围。

我对图像处理相当陌生。我知道有一个解决方案,因为其他系统在 FPGA 中逐像素地动态执行此操作。我只是希望能够在 Matlab 后期处理中做到这一点,而不是实时完成。我知道在 Matlab 中进行按位运算可能有点困难,但我们确实有一个教育许可证,其中包含每个可用的工具箱。

如下所述,这看起来非常像HDR处理。目标不是艺术,而是数据保存。这最终将被投入C++并在自主飞行计算机上飞行,并且在飞行中运行标准臃肿的HDR软件将扼杀我们的计时要求。

感谢您的帮助!

作为旁注,我希望能够为任何增益组合执行此操作。 即 2x 和 30x、4x 和 8x 等。在我的直觉中,我觉得这是一个看似简单的算法或插值,但我不知道从哪里开始。

由于对收益的含义存在一些混淆,我将尝试解释。我们的定制相机上使用的图像传感器(CMOS)能够同时输出两个单独的图像,这两个图像都来自相同的曝光。它可以做到这一点,因为传感器在其数据路径上有 2 个不同的电放大器。

在摄影方面,就像您的数码单反相机能够同时使用2个不同的ISO值拍摄照片一样。

很抱歉造成混乱

您提出的问题称为"高动态范围成像"和"色调映射"。我建议你从那些维基百科文章开始,然后向下钻取到其中引用的参考书目。

您没有提供有关影像的足够详细信息来给出更具体的答案。你提到的"收益"是什么?您是否提高了传感器的增益(达到ISO等效值?),还是使用了更长的曝光时间?11 位像素值是线性的还是已经压缩的?

将 11 位范围升级到 16 位范围乘以 (2^16-1)/(2^11-1)。
假设您想要线性缩放。 (这在纵向扩展时是合理的。

如果增益是离散的(应用于11位范围),则有两个11位图像,它们可能有一些值饱和。

如果增益是在连续(模拟)或浮点范围内应用的,则您的值可能会超出原始的 11 位。此外,如果增益应用于连续(模拟)或浮点范围,则值可能首先缩放到另一个范围,例如[0,1](除以(2^11-1))。如果将值缩放到另一个范围,则必须除以新范围的最大值,而不是除以 (2^11-1)。

无论

哪种方式(无论增益是否在11位范围内),由于增益和加法,结果值可能大于原始范围。在这种情况下,您需要决定如何缩放它们:

  • 是否要将原始 11 位范围缩放到 16 位(可能导致饱和)?
    如果是这样,则乘以 (2^16-1)/(2^11-1)

  • 是否要将最大可能值缩放到 2^16-1?
    如果是这样,则乘以 (2^16-1)/( (2^11-1) * (G1+G2) )

  • 是否要将实际最大值缩放为 2^16-1?
    如果是这样,则乘以 (2^16-1)/(max(sum(I1+I2))

编辑:

由于您不想添加图像,而是在其中使用不同的细节,也许本文将帮助您:

使用闪光灯和无闪光灯图像对进行数码摄影