本文共 2768 字,大约阅读时间需要 9 分钟。
思路由这篇文章提出的算法,该文章是曝光合成,但是其原理 。用在多焦距的合成上,效果也非常不错。
例如前面两张模拟聚焦的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有个自带的HDR合成功能。 我们先导入所有图片,下面勾选尝试自动对齐源图像,否则有可能能因为照片之间的微小距离偏差导致重影。 接下来我们需要手动设置一下每张图片的曝光值,还是挺麻烦的! PS的效果从细节方面没有该论文算法计算的好,但是PS的对齐功能做的非常棒,边缘看不到任何蓝边了。并且我们可以在右边的滑动条中进行微调。接着我们用PS顺便试一试多聚焦的图片看看有没有意外惊喜。
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/