如何在 Matlab/ C++ 中组合具有不同增益的两个图像
How to combine two images with different gains in Matlab/ C++
我有两张图像,都是从同一个探测器同时拍摄的。
两个图像都有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))
编辑:
由于您不想添加图像,而是在其中使用不同的细节,也许本文将帮助您:
使用闪光灯和无闪光灯图像对进行数码摄影
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- Qt-grabtoimage()和scale生成两个重叠的图像
- 如何快速创建一组覆盖两个图像的图像
- 有没有办法将两个输入图像堆叠到卤化物发生器中的单个 4 维缓冲区中?
- 如何在OpenCV中减去两个不同尺寸的图像和灰度图像
- 如何使用mingw64 gcc/g 比较两个图像
- OPENCV:如何使用5点算法从来自不同相机的两个图像之间的特征匹配来计算必需矩阵
- 如何比较QT中的两个RGB图像
- 如何在ROS中很好地订阅两个主题(图像和边界框分开发布)
- 在计算机视觉中减去两个图像
- ITK - 如何合并两个图像
- 从两个图像转换的OpenCV
- 使用条款 使用Opencv和Qt减去两个灰度图像
- 如何以相同的比例转换两个视觉上相似的图像
- 将两个图像附加到 FBO 以进行 MRT 渲染
- 如何区分具有对象坐标的两个图像
- 如何在OpenGL中将两个不同的图像渲染为两个不同图元?2D纹理阵列
- OpenCV Mahalanobis函数,用于计算两个图像之间的距离
- 将两个图像堆栈的非电源加载到 3D 纹理 OpenGL C++