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

时间:2012-06-11 21:16:11

标签: c++ image matlab image-processing

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

两张图片都具有 11位分辨率(是的,它的奇怪,但在这里就是这种情况)。两幅图像之间的差异在于,一幅图像被放大了 1 ,另一幅放大了 10

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

我对图像处理很新。我知道有一个解决方案,因为其他系统在FPGA中逐像素地执行此操作。我只是希望能够在Matlab后期处理而不是实时处理。我知道在Matlab中进行按位操作可能有点困难,但我们确实拥有每个可用工具箱的教育许可证。

如下所述,这看起来非常像HDR处理。目标不是艺术,而是数据保存。这最终将放在C ++中并在自主飞行计算机上飞行,并且在运行中运行标准的膨胀HDR软件会破坏我们的时序要求

感谢您的帮助!

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

收益

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

在摄影术语中,您的数码单反相机可以同时使用 2 不同的ISO值拍摄照片。

对不起有困惑

2 个答案:

答案 0 :(得分:3)

您提出的问题称为"High Dynamic Range Imaging""Tone Mapping"。我建议你从那些维基百科的文章开始,然后深入研究其中引用的参考书目。

您没有提供有关图像的足够详细信息,以提供更具体的答案。你提到的“收获”是什么?您是否提高了传感器的增益(与ISO等效数量相同?),还是使用了更长的曝光时间? 11位像素值是线性的还是已经伽马压缩的?

答案 1 :(得分:0)

将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))

编辑:

由于您不想添加图像,而是使用其中的不同详细信息,因此本文可能会对您有所帮助:

Digital Photography with Flash and No-Flash Image Pairs