首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OpenCV源码系列|图像HDR-1

OpenCV源码系列|图像HDR-1

作者头像
用户9831583
发布2022-06-16 15:40:11
发布2022-06-16 15:40:11
7340
举报
文章被收录于专栏:码出名企路码出名企路

过度,正常和弱曝光图像成一张清晰图像。

过度曝光

正常曝光

弱曝光

HDR调整

代码实现:

代码语言:javascript
复制
#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;


//核心
//根据就是权重,把过曝和欠曝图片合成到dst_mat中。
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);
            //用正常曝光图片像素,来获得使用过曝、欠曝像素合成到dst_mat中对应使用的权值
      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));
            //计算出合成像素值之后,写入到dst_mat对应的坐标位置。进而生成HDR照片
      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;
    //创建两张空白图片:tmp_mat和dst_mat。
  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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档