本篇主要是利用三张图片:过曝(相机设置exposure+1)、正常(相机设置exposure+0)、欠曝(相机设置exposure-1),来合成一张在亮出和暗处细节都清晰
的图片,来简易实现图片的HDR功能。

具体实现

实现代码

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
#include <string.h>
#include <opencv/cv.h>
#include <stdio.h>
#include "opencv2/photo/photo.hpp"using namespace cv;char highpicName[20];
char normalpicName[20];
char lowpicName[20];
Mat mat1, mat2, mat3, dst_mat, tmp_mat;
int highWidth, highHeight;
int normalWidth, normalHeight;
int lowWidth, lowHeight;
IplImage src1, src2, src3, dst_src, tmp_src;
double weight=0.5;void hdrCale(Mat pic1, Mat pic2, Mat pic3){int i, j;CvScalar s1, s2, s3;src1 = pic1;src2 = pic2;src3 = pic3;dst_src = dst_mat;tmp_src = tmp_mat;cvCvtColor(&src2, &tmp_src, CV_BGR2GRAY);for(i=0; i< normalWidth; i++){for(j=0; j<normalHeight; j++){s1 = cvGet2D(&src1, i, j);s2 = cvGet2D(&tmp_src, i, j);s3 = cvGet2D(&src3, i, j);weight = 0.5 + (127 - s2.val[0]) * 0.002;s3.val[0] = (s1.val[0] * weight) + (s3.val[0] * (1-weight));s3.val[1] = (s1.val[1] * weight) + (s3.val[1] * (1-weight));s3.val[2] = (s1.val[2] * weight) + (s3.val[2] * (1-weight));cvSet2D(&dst_src, i, j, s3);} }
}int main(int argc, char *argv[]){if(argc < 4){printf("Please input high exposure/normal exposure/low exposure picture!\n");return -1; }memcpy(highpicName, argv[1], sizeof(argv[1]));memcpy(normalpicName, argv[2], sizeof(argv[2]));memcpy(lowpicName, argv[3], sizeof(argv[3]));mat1 = imread(argv[1]);mat2 = imread(argv[2]);mat3 = imread(argv[3]);highWidth = mat1.rows;highHeight = mat1.cols;normalWidth = mat2.rows;normalHeight = mat2.cols;lowWidth = mat3.rows;lowHeight = mat3.cols;dst_mat = Mat(normalWidth, normalHeight, CV_8UC3, cv::Scalar(0, 0, 0));tmp_mat = Mat(normalWidth, normalHeight, CV_8UC1, cv::Scalar(0, 0, 0));hdrCale(mat1, mat2, mat3);imshow("normal", mat2);imshow("HDR", dst_mat);imwrite("HDR.jpg", dst_mat);cv::waitKey(0);return 0;
}

代码讲解

  1、首先进行相对应的初始化操作:运行软件时候,需要传入三张图片,顺序上分别是:过曝、正常、欠曝。打开这三张图片,保存在mat1、mat2、mat3
中,注意这三张图片必须大小一致。接着获取到图片的width和height。最后创建两张空白图片:tmp_mat和dst_mat。
        if(argc < 4){printf("Please input high exposure/normal exposure/low exposure picture!\n");return -1;  }memcpy(highpicName, argv[1], sizeof(argv[1]));memcpy(normalpicName, argv[2], sizeof(argv[2]));memcpy(lowpicName, argv[3], sizeof(argv[3]));mat1 = imread(argv[1]);mat2 = imread(argv[2]);mat3 = imread(argv[3]);highWidth = mat1.rows;highHeight = mat1.cols;normalWidth = mat2.rows;normalHeight = mat2.cols;lowWidth = mat3.rows;lowHeight = mat3.cols;dst_mat = Mat(normalWidth, normalHeight, CV_8UC3, cv::Scalar(0, 0, 0));tmp_mat = Mat(normalWidth, normalHeight, CV_8UC1, cv::Scalar(0, 0, 0));
  2、接着进入到HDR的算法处理:对应的处理很简单,主要就是根据就是权重,把过曝和欠曝图片合成到dst_mat中。
具体做法:循环依次打开三张图片的同一位置像素,用正常曝光图片像素,利用公式:weight = 0.5 + (127 - s2.val[0]) * 0.002;来获得使用过曝、欠曝像素合成到dst_mat中对应使用的权值。接着:s3.val[0] = (s1.val[0] * weight) + (s3.val[0] * (1-weight));计算出合成像素值之后,写入到dst_mat对应的坐标位置。进而生成HDR照片。
void hdrCale(Mat pic1, Mat pic2, Mat pic3){int i, j;CvScalar s1, s2, s3;src1 = pic1;src2 = pic2;src3 = pic3;dst_src = dst_mat;tmp_src = tmp_mat;cvCvtColor(&src2, &tmp_src, CV_BGR2GRAY);for(i=0; i< normalWidth; i++){for(j=0; j<normalHeight; j++){s1 = cvGet2D(&src1, i, j);s2 = cvGet2D(&tmp_src, i, j);s3 = cvGet2D(&src3, i, j);weight = 0.5 + (127 - s2.val[0]) * 0.002;s3.val[0] = (s1.val[0] * weight) + (s3.val[0] * (1-weight));s3.val[1] = (s1.val[1] * weight) + (s3.val[1] * (1-weight));s3.val[2] = (s1.val[2] * weight) + (s3.val[2] * (1-weight));cvSet2D(&dst_src, i, j, s3);}   }
}
  3、最后将正常照片和HDR照片显示初恋,并将hdr照片保存下来。
        imshow("normal", mat2);imshow("HDR", dst_mat);imwrite("HDR.jpg", dst_mat);cv::waitKey(0);

HDR【openCV实现】相关推荐

  1. android opencv hdr,使用OpenCV 4.0映射HDR图像的色调

    我想创建一个脚本,该脚本需要一个.HDR文件并将其色调映射为.JPG.我看了几个OpenCV tutorials,看来应该可以做到. 我写了这个脚本: import cv2 import numpy ...

  2. opencv实现图片HDR功能

    from: http://blog.csdn.net/u011630458/article/details/46592013 简介 本篇主要是利用三张图片:过曝(相机设置exposure+1).正常( ...

  3. OpenCV hdr成像技术的实例(附完整代码)

    OpenCV hdr成像技术的实例 OpenCV hdr成像技术的实例 OpenCV hdr成像技术的实例 #include "opencv2/photo.hpp" #includ ...

  4. Python+OpenCV:高动态范围(High Dynamic Range, HDR)

    Python+OpenCV:高动态范围(High Dynamic Range, HDR) 目标 Learn how to generate and display HDR image from an ...

  5. Opencv基础使用3——HDR 图像合成

    本博文接上一篇博文,继续进行部分 opencv Python 示例代码运行效果测试 环境搭建.所使用代码版本 -- 参考博文--Opencv基础使用1--分割 - 视频人像跟踪 文章目录 测试数据准备 ...

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

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

  7. android opencv hdr,用 OpenCV 进行高动态范围(HDR)成像

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

  8. 一种基于视神经网络的高动态范围(HDR)图像自适应局部色调映射的实现【OpenCV】【CUDA】

    原理是基于这篇论文--<Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images> 论文提出的背 ...

  9. OpenCV转换HDR图像与源码分析

    我们常见的图像位深一般是8bit,颜色范围[0, 255],称为标准动态范围SDR(Standard Dynamic Range).SDR的颜色值有限,如果要图像色彩更鲜艳,那么就需要10bit,甚至 ...

最新文章

  1. 创建失败_号称人人都可编辑的百科词条,创建之路为何屡屡失败?
  2. android定时循环,Android AlarmManager实现定时循环后台任务
  3. iOS:图片相关(19-05-09更)
  4. phpcms文件所需权限
  5. STF简单修改实现安卓多机同屏控制
  6. 福建工程学院寒假作业第一周G题
  7. cropbox.js 头像裁剪插件
  8. kafka(四)生产者和消费者配置优化
  9. 微信图片显示定位服务器,姚晓雷:通过一张微信图片定位对方具体位置的方法...
  10. Javascript中的Math.max()和Math.min()
  11. mybatis运行原理详解
  12. php操作mysql数据_详解PHP操作MySQL数据库
  13. SpringBoot的properteis书写[配置对象类型数据、配置数组类型
  14. 源码分享:打造「螃蟹火星车」,遥控、拍照、测距,还能做人脸检测;
  15. sql server 2012 KB2716442安装错误解决方案(错误代码 0x84B20001)
  16. 基于java的健身房管理系统的设计与实现
  17. Android Dialog设置宽度显示不正常的问题(自定义设置Dialog的宽高)
  18. SAP GOS cl_gos_manager 添加附件功能
  19. C1任务01 植物大战僵尸存档修改
  20. 猜图达人小游戏V4.1小程序源码可开流量主

热门文章

  1. 面试题3:二维数组中的查找
  2. matplotlib 快速绘图
  3. 25. 合并两个排序的链表
  4. windows下nc(netcat)的安装及使用
  5. python copy()和deepcopy()解释(import copy)
  6. 彻底弄懂计算机中的大端小端
  7. ROS报错:/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:119:9: error: ‘YOU_MIXED_DIFFERENT
  8. C++面试题-青蛙跳台阶的2种解法
  9. 【sql:练习题3】查询在 SC 表存在成绩的学生信息
  10. input全选和取消全选