HDR算法Python实现:Github。先看结果:
使用三脚架用自己手机分别设置-3、0、1 EV拍摄的输入图像:

输出结果(左:0ev,右:HDR结果):

main.py:

from image_io import load_img, save_img
import os
from exposure_fusion import exposure_fusioninput_path = 'data/case5'   # 输入的不同曝光的图片
save_img_name = ''.join(['hdr_output_', os.path.split(input_path)[-1], '.png'])   # output图片文件名
nlev = 9    # 金字塔层数,不能设置过小,否则引起分层input_path_list = []
for i in os.listdir(input_path):input_path_list.append(os.path.join(input_path, i))I = load_img(input_path_list)
R = exposure_fusion(I, [1, 1, 1, nlev])save_img(R * 255, save_img_name)

image_io.py:

import cv2
import numpy as np
import mathdef load_img(imgs_path_list):imgs_arr = []for img_path in imgs_path_list:img_arr = cv2.imread(img_path)imgs_arr.append(img_arr/255)return imgs_arrdef save_img(img_arr, save_path):cv2.imwrite(save_path, img_arr)def offset_process(imgs_arr, nlev):# 图像扩边,防止金字塔采样时出现奇数宽高size = np.shape(imgs_arr[0])h = size[0]w = size[1]last_h = h/(2**(nlev-1))last_w = w/(2**(nlev-1))offset = [0, 0, 0, 0]new_h = math.ceil(last_h) * (2**(nlev-1))new_w = math.ceil(last_w) * (2**(nlev-1))total_add_h = new_h - htotal_add_w = new_w - wahead_add_h = total_add_h // 2ahead_add_w = total_add_w // 2behind_add_h = total_add_h - ahead_add_hbehind_add_w = total_add_w - ahead_add_wfor idx in range(len(imgs_arr)):imgs_arr[idx] = cv2.copyMakeBorder(imgs_arr[idx], ahead_add_h, behind_add_h, ahead_add_w, behind_add_w, cv2.BORDER_REFLECT)offset[0] = ahead_add_hoffset[1] = behind_add_hoffset[2] = ahead_add_woffset[3] = behind_add_wreturn imgs_arr, offset

exposure_fusion.py:

import numpy as np
from gaussian_pyramid import gaussian_pyramid
from laplacian_pyramid import laplacian_pyramid
from image_io import offset_process
from reconstruct_laplacian_pyramid import reconstruct_laplacian_pyramid
from cv2_process import rgb2gray, imfilter
import mathdef exposure_fusion(imgs_arr, param):contrast_parm = param[0]sat_parm = param[1]wexp_parm = param[2]nlev = param[3]size = np.shape(imgs_arr)r = size[1]c = size[2]N = size[0]max_lev = math.floor(math.log2(min(r, c)))if nlev > max_lev:nlev = max_lev# 图像四周扩边处理,让金字塔每层采样都为偶数imgs_arr, offset = offset_process(imgs_arr, nlev)size = np.shape(imgs_arr)r = size[1]c = size[2]W = np.ones([N, r, c])if contrast_parm == 1:W = (W * contrast(imgs_arr, size)) ** contrast_parmif sat_parm == 1:W = (W * saturation(imgs_arr, size)) ** sat_parmif wexp_parm == 1:W = (W * well_exposedness(imgs_arr, size)) ** wexp_parmW = W + 1e-12yuan_W = WW = np.sum(W, axis=0)temp_W = np.expand_dims(W, axis=0)W = np.concatenate([temp_W for i in range(N)], axis=0)W = yuan_W / Wpyr = gaussian_pyramid(np.zeros([r, c, 3]), nlev)for i in range(N):pyrW=  gaussian_pyramid(W[i, :, :], nlev)pyrI = laplacian_pyramid(imgs_arr[i], nlev)for l in range(nlev):W_temp = np.expand_dims(pyrW[l], axis=-1)w = np.concatenate([W_temp, W_temp, W_temp], axis=-1)pyr[l] = pyr[l] + w * pyrI[l]R = reconstruct_laplacian_pyramid(pyr)# 将扩充的四周边缘像素舍弃R = R[offset[0]:r-offset[1], offset[2]:c-offset[3], :]return Rdef contrast(I, size):h = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])N = size[0]C = np.zeros([N, size[1], size[2]])for i in range(N):temp = 255 * I[i] / (I[i].max() - I[i].min())mono = rgb2gray(temp.astype('float32'))C[i, :, :] = np.abs(imfilter(mono, h))return Cdef saturation(I, size):N = size[0]C = np.zeros([N, size[1], size[2]])for i in range(N):B = I[i][:, :, 0]G = I[i][:, :, 1]R = I[i][:, :, 2]mu = (B+R+G) / 3C[i, :, :] = np.sqrt(((R-mu)**2 + (G-mu)**2 + (B-mu)**2)/3)return Cdef well_exposedness(I, size):N = size[0]C = np.zeros([N, size[1], size[2]])sig = 0.2for i in range(N):B = np.exp(-0.5*I[i][:, :, 0] - 0.5)**2/sig**2G = np.exp(-0.5*I[i][:, :, 1] - 0.5)**2/sig**2R = np.exp(-0.5*I[i][:, :, 2] - 0.5)**2/sig**2C[i, :, :] = B * G * Rreturn C

gaussian_pyramid.py:

from cv2_process import downsampledef gaussian_pyramid(I, nlev):pyr = [I]for l in range(1, nlev):I = downsample(I)pyr.append(I)return pyr

laplacian_pyramid.py

from cv2_process import downsample, upsampledef laplacian_pyramid(I, nlev):pyr = []J = Ifor l in range(nlev-1):I = downsample(J)pyr.append(J - upsample(I))J = Ipyr.append(J)return pyr

reconstruct_laplacian_pyramid.py

from cv2_process import upsampledef reconstruct_laplacian_pyramid(pyr):nlev = len(pyr)R = pyr[nlev-1]for l in range(nlev-2, -1, -1):R = pyr[l] + upsample(R)return R

cv2_process.py:

import cv2def downsample(I):return cv2.resize(I, dsize=(0, 0), fx=0.5, fy=0.5)def upsample(I):return cv2.resize(I, dsize=(0, 0), fx=2, fy=2)def rgb2gray(I):img_gray = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY)return img_gray / 255def imfilter(I, h):return cv2.filter2D(I, -1, h)def contrast_clahe(I):b, g, r = cv2.split(I)clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(8, 8))b = clahe.apply(b)g = clahe.apply(g)r = clahe.apply(r)image = cv2.merge([b, g, r])return image

其他结果1:
输入:

输出:

其他结果2:
输入:

输出:

参考:
[1] Mertens T, Kautz J, Van Reeth F. Exposure fusion[C]//15th Pacific Conference on Computer Graphics and Applications (PG’07). IEEE, 2007: 382-390.
[2] https://github.com/Mericam/exposure-fusion

HDR多帧曝光融合Python代码实现相关推荐

  1. XGBOOST + LR 模型融合 python 代码

    XGBOOST + LR (XGBOOST grid search) 先留个广告,最近做一个数据挖掘的比赛,主要用的就是 xgboost,等比赛完后年前好好整理代码开源,到时候代码会比下面整份完整. ...

  2. 帧间差分法python代码_OpenCV实现帧间差分法详解

    本文实例为大家分享了OpenCV实现帧间差分法的具体方法,供大家参考,具体内容如下 一.基本概念 基于视频的车辆检测算法种类很多:光流法检测,帧差法,背景消除法(其中包括:直方图法,平均值法,单分布和 ...

  3. 帧间差分法python代码_图像处理算法之帧间差分法

    1. 基本原理 帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法.当监控场景中出现异常目标运动时,相邻两帧图像之间会出现较为明显的差别,两帧相减,求得图像对应位置像素值 ...

  4. ISP-长短曝光融合生成HDR图像

    1.高动态范围图像相关 图像的动态范围是指一幅图像中量化的最大亮度与最小噪声的比值.高动态范围HDR(high dynamic range)图像,能够完整表示真实场景中跨度很大的动态范围.采用普通CM ...

  5. 加权平均融合消除图像拼接的拼缝(Python 代码)

    这里提供一种采用加权平均融合消除图像拼缝的算法,供大家使用. https://blog.csdn.net/xiaoxifei/article/details/103045958 如下图所示,如果两张图 ...

  6. python图像融合算法_图像融合质量评价方法的python代码实现——MS-SSIM

    图像融合质量评价方法的python代码实现--MS-SSIM 图像融合质量评价方法的python代码实现--MS-SSIM 文章目录 1 前言 2 MS-SSIM介绍 2 MS-SSIM的代码 2.1 ...

  7. IHS图像融合方法+Python代码

    IHS图像融合方法+Python代码 1.方法原理 HIS为:亮度(I ).色调(H).饱和度(S): 强度表示光谱的整体亮度大小,对应于图像的空间分辨率: 传统的IHS图像融合方法基本思想是将IHS ...

  8. 【HDR】曝光融合(Exposure Fusion)

    文章目录 0 前言 1 算法细节 1.1 Naive 1.1.1 主要思想 1.1.2 权重计算 1.1.3 融合 1.2 Multi-resolution 2 实验 3 参考 0 前言 在曝光融合( ...

  9. opencv曝光过度_使用 OpenCV 进行曝光融合(Exposure Fusion)成像

    在本教程中,我们将学习使用OpenCV的Exposure Fusion.我们将使用C ++和Python共享代码. 什么是曝光融合?曝光融合是一种将使用不同曝光设置拍摄的图像组合成一个看起来像色调映射 ...

最新文章

  1. android防治方法被反射,通过去classLoader避免Android P反射限制后还原classLoader的方法...
  2. 高性能javascript-数据访问笔记
  3. android doc例程---Notepad Tutorial学习要点!
  4. 倒计时1天,BDTC2016最新完整版日程公布
  5. Apache Mail 发送带附件的邮件
  6. ttf文件 python 打开_[译]JS解析TTF字体文件
  7. linux下使用source执行文件的含义
  8. Web前端开发配色表及标准颜色表
  9. 个人记账系统c语言,C#实现_______个人记账程序
  10. 微信小程序实现登录Java前后端分离
  11. vnc远程软件,盘点六款你值得拥有的vnc远程软件
  12. python爬取二手房信息_python爬虫爬取链家二手房信息
  13. 中国已消失的 9 所世界级大学
  14. Global and Local Enhancement Networks for Paired and Unpaired Image Enhancement
  15. Python可视化——随机漫步
  16. 关于定点数、原码、反码、补码的理解
  17. opengl简单模拟行星运转
  18. web实现小说阅读器的水平滑动翻页
  19. 论文【Learning to Localize Sound Source in Visual Scenes】soundnet的复现
  20. 最满意的10款PC 软件分享

热门文章

  1. Redis中文乱码问题的解决
  2. Android学习路线总结,绝对干货
  3. 软件园里的流氓(11)
  4. 指代消解《End-to-end Neural Coreference Resolution》
  5. 0903 非常棒的电子学习网站 正弦波电压和电容并联串联的计算
  6. 学习笔记之——晶振选型主要参数和外接匹配电容的计算
  7. STM32PWM控制智能风扇
  8. Python FastAPI 框架 操作Mysql数据库 增删改查
  9. 忍者的时代用计算机怎么弹,火影忍者百豪纲手怎么玩 上墙 弹墙 三连摔操作方法...
  10. 51单片机的输入输出简介