日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv实现图片HDR功能

發(fā)布時間:2025/7/25 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv实现图片HDR功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

簡介

  本篇主要是利用三張圖片:過曝(相機設(shè)置exposure+1)、正常(相機設(shè)置exposure+0)、欠曝(相機設(shè)置exposure-1),來合成一張在亮出和暗處細節(jié)都清晰 的圖片,來簡易實現(xiàn)圖片的HDR功能。

具體實現(xiàn)

實現(xiàn)代碼

#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、首先進行相對應(yīng)的初始化操作:運行軟件時候,需要傳入三張圖片,順序上分別是:過曝、正常、欠曝。打開這三張圖片,保存在mat1、mat2、mat3 中,注意這三張圖片必須大小一致。接著獲取到圖片的width和height。最后創(chuàng)建兩張空白圖片: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的算法處理:對應(yīng)的處理很簡單,主要就是根據(jù)就是權(quán)重,把過曝和欠曝圖片合成到dst_mat中。 具體做法:循環(huán)依次打開三張圖片的同一位置像素,用正常曝光圖片像素,利用公式:weight = 0.5 + (127 - s2.val[0]) * 0.002;來獲得使用過曝、欠曝像素合成到dst_mat中對應(yīng)使用的權(quán)值。接著:s3.val[0] = (s1.val[0] * weight) + (s3.val[0] * (1-weight));計算出合成像素值之后,寫入到dst_mat對應(yīng)的坐標位置。進而生成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);

效果演示

?

對應(yīng)的效果演示如下:過曝圖像:

正常圖像

欠曝圖像:

HDR圖像

?

總結(jié)

以上是生活随笔為你收集整理的opencv实现图片HDR功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。