#include "function.h"void simple_color_balance(float ** input_img, float ** out_img, int rows, int cols) {float max_value = 0;float min_value = 256;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {max_value = max(max_value,input_img[i][j]);min_value = min(min_value, input_img[i][j]);}}if (max_value <= min_value) {for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {out_img[i][j] = max_value;}}}else {float scale = 255.0 / (max_value - min_value);for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (input_img[i][j] < min_value) {out_img[i][j] = 0;}else if (input_img[i][j] > max_value) {out_img[i][j] = 255;}else {out_img[i][j] = scale * (input_img[i][j] - min_value);}}}}}int HDR(cv::Mat input_img, cv::Mat out_img) {int rows = input_img.rows;int cols = input_img.cols;//DouImgfloat ***DouImg;DouImg = new float **[rows];for (int i = 0; i < rows; i++) {DouImg[i] = new float *[cols];for (int j = 0; j < cols; j++) {DouImg[i][j] = new float[3];}}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {DouImg[i][j][0] = (float)input_img.at<Vec3b>(i, j)[0];DouImg[i][j][1] = (float)input_img.at<Vec3b>(i, j)[1];DouImg[i][j][2] = (float)input_img.at<Vec3b>(i, j)[2];}}//Lwfloat **Lw;Lw = new float *[rows];for (int i = 0; i < rows; i++) {Lw[i] = new float [cols];}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {Lw[i][j] = 0;}}//Bfloat **B;B = new float *[rows];for (int i = 0; i < rows; i++) {B[i] = new float[cols];}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {B[i][j] = (float)input_img.at<Vec3b>(i, j)[0];}}//Gfloat **G;G = new float *[rows];for (int i = 0; i < rows; i++) {G[i] = new float[cols];}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {G[i][j] = (float)input_img.at<Vec3b>(i, j)[1];}}//Rfloat **R;R = new float *[rows];for (int i = 0; i < rows; i++) {R[i] = new float[cols];}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {R[i][j] = (float)input_img.at<Vec3b>(i, j)[2];}}//Lwmaxfloat Lwmax = 0.0;//Lwfor (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {Lw[i][j] = 0.299 * R[i][j] + 0.587 * G[i][j] + 0.114 * B[i][j];if (Lw[i][j] == 0) {Lw[i][j] = 1;}Lwmax = max(Lw[i][j], Lwmax);}}//Lw_sumfloat Lw_sum = 0;//log_Lwfloat **log_Lw;log_Lw = new float *[rows];for (int i = 0; i < rows; i++) {log_Lw[i] = new float[cols];}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {log_Lw[i][j] = log(0.001 + Lw[i][j]);Lw_sum += log_Lw[i][j];}}//Lwaverfloat Lwaver = exp(Lw_sum / (rows * cols));//Lgfloat **Lg;Lg = new float *[rows];for (int i = 0; i < rows; i++) {Lg[i] = new float[cols];}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {Lg[i][j] = log(Lw[i][j] / Lwaver + 1) / log(Lwmax / Lwaver + 1);}}//gainfloat **gain;gain = new float *[rows];for (int i = 0; i < rows; i++) {gain[i] = new float[cols];}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {gain[i][j] = Lg[i][j] / Lw[i][j];}}//gain*B, gain*G, gain*Rfor (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {B[i][j] *= gain[i][j];G[i][j] *= gain[i][j];R[i][j] *= gain[i][j];}}simple_color_balance(B, B, rows, cols);simple_color_balance(G, G, rows, cols);simple_color_balance(R, R, rows, cols);for (int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++){out_img.at<Vec3b>(i, j)[0] = uchar((int)B[i][j]);out_img.at<Vec3b>(i, j)[1] = uchar((int)G[i][j]);out_img.at<Vec3b>(i, j)[2] = uchar((int)R[i][j]);}}//Free//DouImgfor (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {delete DouImg[i][j];}delete DouImg[i];}delete DouImg;//Lwfor (int i = 0; i < rows; i++) {delete[] Lw[i];}delete Lw;//log_Lwfor (int i = 0; i < rows; i++) {delete[] log_Lw[i];}delete log_Lw;//Bfor (int i = 0; i < rows; i++) {delete[] B[i];}delete B;//Gfor (int i = 0; i < rows; i++) {delete[] G[i];}delete G;//Rfor (int i = 0; i < rows; i++) {delete[] R[i];}delete R;//Lgfor (int i = 0; i < rows; i++) {delete[] Lg[i];}delete Lg;//gainfor (int i = 0; i < rows; i++) {delete[] gain[i];}delete gain;return 0;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。