日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

opencv实现图片HDR功能

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

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功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。