[OpenCV实战]24 使用OpenCV进行曝光融合

您所在的位置:网站首页 ps多个图像平均融合成一张图片 [OpenCV实战]24 使用OpenCV进行曝光融合

[OpenCV实战]24 使用OpenCV进行曝光融合

2024-07-11 20:27| 来源: 网络整理| 查看: 265

目录

1 什么是曝光融合

2 曝光融合的原理

3 代码与结果

4 参考

本教程中,我们将了解使用OpenCV的Exposure Fusion(曝光融合)。

1 什么是曝光融合

曝光融合是一种将使用不同曝光设置拍摄的图像合成为一张看起来像色调映射的高动态范围(HDR)图像的图像的方法。当我们使用相机拍摄照片时,每个颜色通道只有8位来表示场景的亮度。然而,我们周围世界的亮度理论上可以从0(黑色)到几乎无限(直视太阳)。因此,傻瓜相机或移动相机根据场景决定曝光设置,以便使用相机的动态范围(0-255值)来表示图像中最有趣的部分。例如,在许多相机中,使用面部检测来查找面部并设置曝光,使得面部看起来很好。这引出了一个问题-我们可以在不同的曝光设置下拍摄多张照片并拍摄更大范围的场景亮度吗?答案是肯定的。传统上使用HDR成像然后进行色调映射的方式。具体见上篇文章:

https://blog.csdn.net/LuohenYJ/article/details/89712234

HDR成像要求我们知道精确的曝光时间。HDR图像本身看起来很暗,看起来不太漂亮。DR图像中的最小强度为0,但理论上没有最大值。所以我们需要将其值映射到0到255之间,以便我们可以显示它。将HDR图像映射到常规的每通道8位彩色图像的过程称为色调映射。如您所见,组装HDR图像和色调映射有点麻烦。我们不能不使用HDR就使用多个图像创建色调映射图像。结果证明我们可以用曝光融合来实现。

2 曝光融合的原理

应用曝光融合的步骤如下所述:

(1) 使用不同曝光拍摄多张图像

首先,我们需要在不移动相机的情况下捕获同一场景的一系列图像。如上所示,序列中的图像具有不同的曝光。这是通过改变相机的快门速度来实现的。通常,我们选择一些曝光不足的图像,一些曝光过度的图像和一个正确曝光的图像。

在“正确”曝光的图像中,选择快门速度(由相机或摄影师自动选择),以便每通道8位动态范围用于表示图像中最有趣的部分。太暗的区域被剪切为0,而太亮的区域被饱和到255。

在曝光不足的图像中,快门速度很快,图像很暗。因此,图像的8位用于捕获亮区域,而暗区域被剪切为0。在曝光过度的图像中,快门速度较慢,因此传感器捕获的光线更多,因此图像更亮。传感器的8位用于捕获暗区域的强度,而亮区域饱和到255的值。大多数单反相机都有一个称为自动曝光包围(AEB)的功能,只需按一下按钮,我们就可以在不同曝光下拍摄多张照片。当我们在iPhone中使用HDR模式时,它需要三张照片(安卓可以下载超级相机这个软件)。

(2) 图像对齐

即使使用三脚架获取序列中的图像也需要对齐,因为即使较小的相机抖动也会降低最终图像的质量。OpenCV提供了一种使用对齐这些图像的简便方法AlignMTB。该算法将所有图像转换为中值阈值位图(MTB)。通过将值1分配给比中值亮度更亮的像素来计算图像的MTB,否则为0。MTB 对曝光时间不变。因此,可以对准MTB而无需我们指定曝光时间。

(3) 图像融合

具有不同曝光的图像捕获不同范围的场景亮度。根据Tom Mertens,Jan Kautz和Frank Van Reeth 题为Exposure Fusion的论文。论文见:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.64.7616&rep=rep1&type=pdf

曝光融合通过仅保留多重曝光图像序列中的“最佳”部分来计算所需图像。

作者提出了三个质量指标:

1曝光良好:如果序列中的图像中的像素接近零或接近255,则不应使用该图像来查找最终像素值。其值接近中间强度(128)的像素是比较合适的。

2对比度:高对比度通常意味着高品质。因此,对于该像素,给予特定像素的对比度值高的图像具有更高的权重。

3饱和度:类似地,更饱和的颜色更少被淘汰并且代表更高质量的像素。因此,特定像素的饱和度高的图像被赋予该像素的更高权重。

三种质量度量用于创建权重图,该权重图表示图像在位置处的像素的最终强度中的贡献。对权重图进行归一化,使得对于任何像素,所有图像的贡献总计为1。

结合权重图使用以下等式组合图像是很有效的:

其中,是原始图像,是输出图像。问题在于,由于像素是从不同曝光的图像中拍摄的,因此使用上述等式获得的输出图像将显示许多裂缝。该论文的作者使用拉普拉斯金字塔来混合图像。我们将在以后的文章中介绍这项技术的细节。

幸运的是使用OpenCV,这种图像曝光融合合并只是使用MergeMertens该类的两行代码。请注意,这个名字取决于Exposure Fusion论文的第一作者Tom Mertens 。

3 代码与结果

代码地址:

https://github.com/luohenyueji/OpenCV-Practical-Exercise

C++:

#include "pch.h" #include #include #include #include using namespace cv; using namespace std; // Read Images void readImages(vector &images) { int numImages = 16; static const char* filenames[] = { "image/memorial0061.jpg", "image/memorial0062.jpg", "image/memorial0063.jpg", "image/memorial0064.jpg", "image/memorial0065.jpg", "image/memorial0066.jpg", "image/memorial0067.jpg", "image/memorial0068.jpg", "image/memorial0069.jpg", "image/memorial0070.jpg", "image/memorial0071.jpg", "image/memorial0072.jpg", "image/memorial0073.jpg", "image/memorial0074.jpg", "image/memorial0075.jpg", "image/memorial0076.jpg" }; //读图 for (int i = 0; i < numImages; i++) { Mat im = imread(filenames[i]); images.push_back(im); } } int main() { // Read images 读取图像 cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3