博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多曝光、多焦距图像合成(Opencv / C++)
阅读量:3904 次
发布时间:2019-05-23

本文共 2768 字,大约阅读时间需要 9 分钟。

多曝光、多焦距图像合成(Opencv / C++)

思路由这篇文章提出的算法,该文章是曝光合成,但是其原理 。用在多焦距的合成上,效果也非常不错。

论文
经典lena
例如前面两张模拟聚焦的CV女神lena图,处理结果即为第三张,效果很不错。

好的言归正传,该论文的作者当然是为了做多曝光的合成啦!上图!

前八张后八张
快门时间分别是(单位是秒分之一)
0.03125、0.0625、0.125、0.25、0.5、1、2、4
8、16、32、64、128、256、512、1024

大概看这个快门时间可以知道这个教堂应该是光线本身就不太好。

教堂
咱们将这16张图导入photoshop试试ps自带的HDR合成功能。
PS
PS有个自带的HDR合成功能。
在这里插入图片描述
我们先导入所有图片,下面勾选尝试自动对齐源图像,否则有可能能因为照片之间的微小距离偏差导致重影。
设置
接下来我们需要手动设置一下每张图片的曝光值,还是挺麻烦的!
ps效果
PS的效果从细节方面没有该论文算法计算的好,但是PS的对齐功能做的非常棒,边缘看不到任何蓝边了。并且我们可以在右边的滑动条中进行微调。

接着我们用PS顺便试一试多聚焦的图片看看有没有意外惊喜。

PSlena
PS的效果有些模糊了,我估计应该是因为找不到对齐点,所以有些模糊了。
暴力
在我意外中使用暴力朴素的相加除二法,尽然神奇发现这个效果比PS的更好一些…

言归正传。

由于这个论文的算法比较成熟且效果不错,OpenCV已经提供了API供使用。
那么我们直接附上代码。

//论文"Exposure Fusion"中的方法#include
#include
using namespace std;using namespace cv;void readImages(vector
& images)//加引用可节省50%的内存消耗{
int numImages = 16; static const char* filenames[] = {
"C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0061.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0062.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0063.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0064.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0065.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0066.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0067.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0068.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0069.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0070.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0071.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0072.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0073.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0074.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0075.png", "C:\\Users\\hl\\Desktop\\图片数据集\\多曝光数据集2\\Memorial_SourceImages\\memorial0076.png" }; for (int i = 0; i < numImages; i++) {
Mat im = imread(filenames[i]); images.push_back(im); }}int main(){
vector
images; //读取图片 readImages(images); //对齐图片 Ptr
alignMTB = createAlignMTB(); alignMTB->process(images, images); //曝光合成(Mertens是该论文的作者)被OpenCV集成为函数了 Mat Fusion; Ptr
mergeMertens = createMergeMertens(); mergeMertens->process(images,Fusion); imshow("合成图像", Fusion); waitKey(); return 0;}

转载地址:http://lamen.baihongyu.com/

你可能感兴趣的文章
DB sharding and ID design
查看>>
DB slave master architecture - read, write separation
查看>>
mysql replication by mysqldump & xtrabackup
查看>>
mysql replication copy master to slave
查看>>
linux/unix rules for naming file and directory
查看>>
Identify Linux File System Type
查看>>
linux file system brief intro
查看>>
Choose a journaling file system
查看>>
ext3 jornal mode
查看>>
centos security & tuning
查看>>
Ext2 vs Ext3 vs Ext4
查看>>
linux fix superblock not found
查看>>
linux file System directory
查看>>
linux file System inode
查看>>
linux evaluate inode
查看>>
API monitor
查看>>
typeahead/autocomplete
查看>>
TernarySearchTree
查看>>
auto-complete
查看>>
codepen intro - frontend exercise
查看>>