在本教程中,我们将学习使用OpenCV的Exposure Fusion。我们将使用C ++和Python共享代码。

什么是曝光融合?曝光融合是一种将使用不同曝光设置拍摄的图像组合成一个看起来像色调映射的高动态范围(HDR)图像的方法。

如果您不了解HDR成像或想了解更多,请查看我们有关

当我们使用相机拍摄照片时,每个颜色通道只有8位来表示场景的亮度。但是,理论上,我们周围世界的亮度可以从0(黑色)变化到几乎无限(直视太阳)。因此,傻瓜相机或移动相机会根据场景决定曝光设置,以便使用相机的动态范围(0-255值)来表示图像中最有趣的部分。例如,在许多相机中,人脸检测用于查找人脸,并设置了曝光度,以使人脸看起来明亮。

这就引出了一个问题-我们可以在不同的曝光设置下拍摄多张照片,并捕获更大范围的场景亮度吗?答案是肯定的!使用

HDR成像要求我们知道精确的曝光时间。HDR图像本身看起来很暗,看起来也不漂亮。HDR图像中的最小强度为0,但理论上没有最大值。因此,我们需要将其值映射在0到255之间,以便我们可以显示它。将HDR图像映射到常规的每通道8位彩色图像的过程称为“色调映射”。

如您所见,组装HDR图像然后进行色调映射是一件麻烦的事。我们不能只使用多个图像并创建一个色调映射图像,而无需去HDR。事实证明,我们可以使用Exposure Fusion做到这一点。Download Guide​bigvisionllc.leadpages.net

曝光融合如何工作?

下面介绍了应用曝光融合的步骤

步骤1:以不同的曝光度拍摄多张图像

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

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

在曝光不足的图像中,快门速度较快,图像较暗。因此,图像的8位用于捕获亮区域,而暗区域被裁剪为0。

在曝光过度的图像中,快门速度很慢,因此传感器会捕获更多的光,因此图像明亮。传感器的8位用于捕获暗区的强度,而亮区饱和到255。

大多数单反相机具有一项称为自动包围曝光(AEB)的功能,该功能使我们只需按一下按钮就可以在不同的曝光下拍摄多张照片。如果您使用的是iPhone,则可以使用此

捕获这些图像后,我们可以使用下面的代码读取它们。

C++

void readImages(vector &images)

{

int numImages = 16;

static const char* filenames[] =

{

"images/memorial0061.jpg",

"images/memorial0062.jpg",

"images/memorial0063.jpg",

"images/memorial0064.jpg",

"images/memorial0065.jpg",

"images/memorial0066.jpg",

"images/memorial0067.jpg",

"images/memorial0068.jpg",

"images/memorial0069.jpg",

"images/memorial0070.jpg",

"images/memorial0071.jpg",

"images/memorial0072.jpg",

"images/memorial0073.jpg",

"images/memorial0074.jpg",

"images/memorial0075.jpg",

"images/memorial0076.jpg"

};

for(int i=0; i < numImages; i++)

{

Mat im = imread(filenames[i]);

images.push_back(im);

}

}

Python

def readImagesAndTimes():

filenames = [

"images/memorial0061.jpg",

"images/memorial0062.jpg",

"images/memorial0063.jpg",

"images/memorial0064.jpg",

"images/memorial0065.jpg",

"images/memorial0066.jpg",

"images/memorial0067.jpg",

"images/memorial0068.jpg",

"images/memorial0069.jpg",

"images/memorial0070.jpg",

"images/memorial0071.jpg",

"images/memorial0072.jpg",

"images/memorial0073.jpg",

"images/memorial0074.jpg",

"images/memorial0075.jpg",

"images/memorial0076.jpg"

]

images = []

for filename in filenames:

im = cv2.imread(filename)

images.append(im)

return images

步骤2:对齐图片

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

使用以下代码行执行基于MTB的对齐。

C++

// Align input imagesPtr alignMTB = createAlignMTB();

alignMTB->process(images, images);

Python

# Align input images

alignMTB = cv2.createAlignMTB()

alignMTB.process(images, images)

合并图像

具有不同曝光量的图像会捕获不同范围的场景亮度。根据Tom Mertens,Jan Kautz和Frank Van Reeth 题为“曝光融合通过仅在多重曝光图像序列中保留“最佳”部分来计算所需图像。

作者提出了三种质量衡量标准曝光良好:如果序列中图像中的像素接近零或接近255,则不应使用该图像来查找最终像素值。值接近中间强度(128)的像素是优选的。

对比度:高对比度通常表示高质量。因此,对特定像素的对比度值较高的图像,将赋予该像素较高的权重。

饱和度:类似地,更多的饱和度颜色较少被冲洗掉,代表更高质量的像素。因此,对特定像素的饱和度较高的图像赋予该像素较高的权重。

使用这三个质量度量来创建权重图

,该权重图表示

图像在位置的像素最终强度中的贡献

。对权重图

进行归一化,以便对于任何像素

,所有图像的贡献总计为1。

使用权重图使用以下公式组合图像很诱人

其中,

是原始图像,

是输出图像。问题在于,由于像素是从不同曝光量的图像中

获取的,因此使用上述公式获得的输出图像将显示很多接缝。该论文的作者使用拉普拉斯金字塔混合图像。我们将在以后的文章中详细介绍这种技术。您还可能有兴趣在检查出的所谓影像拼接技术

幸运的是,使用OpenCV,此合并仅是使用MergeMertens该类的两行代码。请注意,该名称以

C++

Mat exposureFusion;

Ptr mergeMertens = createMergeMertens();

mergeMertens->process(images, exposureFusion);

Python

mergeMertens = cv2.createMergeMertens()

exposureFusion = mergeMertens.process(images)

结果

结果之一在本文中被分享为特征图片。请注意,在输入图像中,我们获得了曝光过度图像中光线昏暗区域和曝光不足图像中光线明亮区域中的细节。但是,在合并的输出图像中,所有像素在图像的每个部分都被很好地照亮了。

我们还可以在之前的文章中看到这种效果对用于

曝光融合与HDR

如您在本文中所见,Exposure Fusion使我们无需显式计算HDR图像即可获得类似于HDR +色调映射的效果。因此,我们不需要知道每个图像的曝光时间,但是我们可以获得非常合理的结果。

那么,为什么还要烦恼HDR?好吧,在许多情况下,Exposure Fusion产生的输出可能并不符合您的喜好。没有旋钮可以调整以使其与众不同或更好。另一方面,HDR图像捕获场景的原始亮度。如果您不喜欢色调映射的HDR图像,请尝试使用其他色调映射算法。

总之,Exposure Fusion代表了一种权衡。我们在权衡灵活性的同时,还追求速度和不严格的要求(例如,不需要曝光时间)。

作者介绍:

萨蒂亚·马利克(SATYA MALLICK)我是一位热爱计算机视觉和机器学习的企业家。我在该领域有十几年的经验(和博士学位)。我是TAAZ Inc的共同创始人,在这里,我们的计算机视觉和机器学习算法的可伸缩性,鲁棒性已受到超过1亿尝试过我们产品的用户的严格测试。

参考资料

opencv曝光过度_使用 OpenCV 进行曝光融合(Exposure Fusion)成像相关推荐

  1. 曝光融合Exposure Fusion 与ghost

    1.概述 说到EF那我们不得不谈谈HDR.高动态范围(HDR)图像可以表示动态范围跨度很大的真实场景.图像的动态范围(dynamic range)是指一幅图像中可见区域最大亮度与最小亮度的比值.同样的 ...

  2. opencv曝光过度_软件开发|使用 OpenCV 进行高动态范围(HDR)成像

    在本教程中,我们将学习如何使用由不同曝光设置拍摄的多张图像创建高动态范围High Dynamic Range(HDR)图像. 我们将以 C++ 和 Python 两种形式分享代码. 什么是高动态范围成 ...

  3. opencv曝光过度_直方图均衡化

    直方图均衡化 想象一下,如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高.但是一副高质量的图像的像素值分布应该很广泛.所以 ...

  4. opencv曝光过度_图像增强 Image Enhancement

    图像增强(Image Enhancement),其目的是要改善图像的视觉效果. 自动色阶 作用:自动调整图像中的黑白场. 原理:剪切每个通道中的阴影和高光部分,并将每个颜色通道中最亮或最暗的像素映射到 ...

  5. opencv 全志_移植opencv人脸识别到全志A10开发板上 +linux3.0内核

    移植opencv人脸识别 libz:    zlib-1.2.3 libjpeg:   jpegsrc.v6b libpng:   libpng-1.2.18 libyasm:   yasm-0.7. ...

  6. opencv图像拼接_使用OpenCV进行图像全景拼接

    点击上方"AI小白学视觉",选择加"星标"或"置顶"重磅干货,第一时间送达 图像拼接是计算机视觉中最成功的应用之一.如今,很难找到不包含此功 ...

  7. opencv入门_【OpenCV入门之十八】通过形态学操作提取水平与垂直线

    小白导读 学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了[OpenCV入门]系列.新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更 ...

  8. opencv三维重建_基于OpenCV和C++的多视图三维重建

    前两张图采用本质矩阵计算RT的方法,然后三角测量计算三维坐标.具体原理可以百度. 后面的增量图采用PnP的方法.通过计算图2图3匹配点和图1图2匹配点的公共部分,而图1和图2已经重建完成了,这些公共部 ...

  9. python opencv 连通域_基于OpenCV及连通域分析进行文本块分割

    上一次通过投影的方式进行了文本块分割,但这种方法有很大的局限性,要求分行清晰.不能有字符跨多行.不能倾斜,而且对噪声比较敏感.还是拿上一回的图片,但是我在上面加了一个比较大的字,得出的结果就有问题了: ...

最新文章

  1. Java多线程发展简史
  2. C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
  3. 控制台浏览器代码实战
  4. 如何下载SAP Intelligent Robotic Process Automation相关的软件
  5. 无法使用tomcat6.exe启动服务
  6. php网站标签加小图标,在htmltitle/title标签添加图标,网页title左边显示网页的logo图标...
  7. Java中<? super T>和List<? extends T>的区别
  8. 31省份开学时间一览表
  9. python字典_python字典可变吗
  10. python3.4新特性_Python3中的新特性(1)——新的语言特性
  11. python: numpy--函数 shape用法
  12. python如何复制文件?
  13. python机器学习彩票_Python机器学习及实战kaggle从零到竞赛PDF电子版分享
  14. (原創) 如何控制DE2 VGA輸出時某座標的顏色? (IC Design) (DE2) (Quartus II)
  15. 【卫朋】硬件创业:营销与开发同行
  16. vba字典的key属性、item属性和keys方法、items方法、add方法
  17. 计算机开题报告答辩评语,开题报告评语4篇
  18. Explain的解读
  19. Linux刻录光盘win10认不到,Win10无法读取DVD光驱和刻录光盘怎么办 Win10不能读取DVD光驱和刻录光盘解决方法...
  20. 在阿里云从0开始部署vue+springboot项目

热门文章

  1. oracle如何删除重复数据保留第一条记录
  2. 解决开发qq音乐singer-detail组件时子路由跳转失败问题
  3. Markdown编辑器Editor.md插件的使用
  4. Android开发者该学习哪些东西提高竞争力?成功入职腾讯
  5. NLP实战|如何用280多万条豆瓣影评预测电影评分?
  6. How to Write a Spelling Corrector
  7. ThingJS官方案例(四):快速应用3D场景下的模拟导航能力
  8. 谷粒学院(十五)JWT | 阿里云短信服务 | 登录与注册前后端实现
  9. Win11任务栏怎么透明?Win11任务栏全透明设置教程
  10. spring成神之路第二十九篇:BeanFactory 扩展(BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor)...