from: http://blog.csdn.net/u011630458/article/details/46592013

简介

  本篇主要是利用三张图片:过曝(相机设置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实现图片HDR功能相关推荐

  1. DALSA线阵CCD相机开发 之 opencv读取图片

    SDK的下载 Sapera_LT_8.31_SDK 百度网盘下载地址:链接:密码:ckm7. SDK的安装 解压运行.exe文件,按照提示确定,下一步即可. 帮助文档和demo 如果要获得完整的帮助文 ...

  2. python基于opencv的手势识别_怎么在Python3.5 中利用OpenCV实现一个手势识别功能

    怎么在Python3.5 中利用OpenCV实现一个手势识别功能 发布时间:2020-12-22 11:56:32 来源:亿速云 阅读:67 作者:Leah 怎么在Python3.5 中利用OpenC ...

  3. python切割图片文字_Python+opencv 实现图片文字的分割的方法示例

    Python+opencv 实现图片文字的分割的方法示例 发布时间:2020-08-26 03:28:37 来源:脚本之家 阅读:116 作者:坏小孩90 实现步骤: 1.通过水平投影对图形进行水平分 ...

  4. 基于opencv的图片模板匹配及其简单应用

    opencv的图片模板匹配及其简单应用 我的个人博客 基础知识 基于opencv的图片模板匹配 注: python及其相关包的安装不在讨论范围内 opencv提供了图片模板匹配的方法, cv2.mat ...

  5. python车牌识别系统开源代码_python+opencv实现车牌定位功能(实例代码)

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验三. 由于时间紧张,代码没有进行任何优化, ...

  6. openCV读入图片,openGL实现纹理贴图

    本文结合结合openCV,openGL的优点,实现混合编程. (1)OpenCV提供图形处理和计算机视觉方面的通用算法,读入二维图片很方便: (2)OpenGL是跨平台的图形程序接口,它用于二维,三维 ...

  7. python opencv获取图片分辨率_python-opencv遍历图片像素,并对像素进行操作

    看代码: def access_pixels(frame): print(frame.shape) #shape内包含三个元素:按顺序为高.宽.通道数 height = frame.shape[0] ...

  8. Opencv实现鼠标截图功能

    1.坐标系 首先我们先认识一下opencv的坐标系,我们的图片坐标系都是以左上角为原点,向右和向下形成一个x,y坐标系,表示一张图片的大小就用原点坐标加上图片的宽高即可(0,0,width,heigh ...

  9. 佳能hdr_内置HDR功能 佳能5D3特色拍摄功能解析

    HDR成像是目前全新的一代高端数码相机普遍具备了一种功能,名声在外.而在具备此功能的单反产品中,佳能EOS 5D Mark III算是一款人气值较高的产品,笔者今天就为大家解析一下这个重要的新功能,并 ...

最新文章

  1. pyglet and opengl -- 纹理映射以及动画
  2. STM32 进阶教程 10 - RAM中调试程序
  3. Java中的基本数据类型以及Java的基本结构
  4. f-measure[转]
  5. 苍天饶过谁?| 今日最佳
  6. LeetCode 1133. 最大唯一数
  7. 微商如何打印电子面单
  8. FB是磁珠的符号,磁珠有很高的电阻率和磁导率,他等效于电阻和电感串联
  9. JAVA深度学习文本审核_内容审核-文本
  10. 黑色的计算机英语,黑色英文怎么说_黑色的英文怎么写 - 沪江英语
  11. 面试的反杀-你有没有想要问我的
  12. 用python绘制叠加等边三角形_python叠加等边三角形绘制
  13. js如何实现侧边广告_如何用稳定器轻松实现低成本的商业级广告片制作?
  14. 聚类 Cluster
  15. 2876: [Noi2012]骑行川藏 - BZOJ
  16. Ubuntu live系统制作方法
  17. Unity 查找子节点物体/组件 递归方法
  18. ESR传感器状态ESR-SENS
  19. 康心农业(app)开发需求,模式火爆
  20. Newman的安装使用

热门文章

  1. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
  2. python使用阿里云sdk
  3. 阿里云ubuntu14.04下lamp环境搭建の备忘
  4. 土耳其黑客因窃取信用卡信息被判入狱334年
  5. linux下目录的个个文件夹含义
  6. CDR配置助手 1.0 绿色免费版
  7. spring3 发送邮件和附件
  8. poj 2763 Housewife Wind
  9. 【电信业务】【原则与规范】SOA 面向服务架构
  10. Aix netstat命令解析