暗光图像增强—opencv(C++)

code1

// An highlighted block
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
#include<math.h>
using namespace cv;
using namespace std;
//图像的三个颜色通道
#define BLUE    0
#define GREEN   1
#define RED     2#ifndef SCREEN_XY
#define SCREEN_XY(x, y)  (255 - ((255 - (x))*(255 - (y)) >> 8))//将新的图层与原图做滤色混合
//x为原始图像像素值,y为新图层的像素值
#endif
double Transform(double x)
{if (x <= 0.05)return x * 2.64;return 1.099 * pow(x, 0.9 / 2.2) - 0.099;
}
struct zxy {double x, y, z;
}s[2500][2500];Mat work(Mat input_img) {int rows = input_img.rows;int cols = input_img.cols;double r, g, b;double lwmax = -1.0, base = 0.75;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {b = (double)input_img.at<Vec3b>(i, j)[0] / 255.0;g = (double)input_img.at<Vec3b>(i, j)[1] / 255.0;r = (double)input_img.at<Vec3b>(i, j)[2] / 255.0;s[i][j].x = (0.4124 * r + 0.3576 * g + 0.1805 * b);s[i][j].y = (0.2126 * r + 0.7152 * g + 0.0722 * b);s[i][j].z = (0.0193 * r + 0.1192 * g + 0.9505 * b);lwmax = max(lwmax, s[i][j].y);}}for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {double xx = s[i][j].x / (s[i][j].x + s[i][j].y + s[i][j].z);double yy = s[i][j].y / (s[i][j].x + s[i][j].y + s[i][j].z);double tp = s[i][j].y;//修改CIE:X,Y,Zs[i][j].y = 1.0 * log(s[i][j].y + 1) / log(2 + 8.0 * pow((s[i][j].y / lwmax), log(base) / log(0.5))) / log10(lwmax + 1);double x = s[i][j].y / yy * xx;double y = s[i][j].y;double z = s[i][j].y / yy * (1 - xx - yy);//转化为用RGB表示r = 3.2410 * x - 1.5374 * y - 0.4986 * z;g = -0.9692 * x + 1.8760 * y + 0.0416 * z;b = 0.0556 * x - 0.2040 * y + 1.0570 * z;if (r < 0)r = 0; if (r > 1)r = 1;if (g < 0)g = 0; if (g > 1)g = 1;if (b < 0)b = 0; if (b > 1)b = 1;//修正补偿r = Transform(r), g = Transform(g), b = Transform(b);input_img.at<Vec3b>(i, j)[0] = int(b * 255);input_img.at<Vec3b>(i, j)[1] = int(g * 255);input_img.at<Vec3b>(i, j)[2] = int(r * 255);} }return input_img;
}
int main() {Mat src_1=imread("c:\\users\\fhgx\\desktop\\image\\1.jpg");imshow("原图", src_1);Mat out2;out2=work(src_1);imshow("增强后的图像1", out2);Mat out;medianBlur(out2, out, 5);imshow("滤波后的图像", out);waitKey();return 0;
}

结果:

code2

// An highlighted block
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
#include<math.h>
using namespace cv;
using namespace std;
//图像的三个颜色通道
#define BLUE    0
#define GREEN   1
#define RED     2#ifndef SCREEN_XY
#define SCREEN_XY(x, y)  (255 - ((255 - (x))*(255 - (y)) >> 8))//将新的图层与原图做滤色混合
//x为原始图像像素值,y为新图层的像素值
#endifMat dark_light(Mat src)
{int size = src.cols * src.rows;//获取原图像的大小uchar r = 0, g = 0, b = 0, g_alpha = 0;//定义参数初始值uchar* pSrcData = src.data;//获取图图像的像素值for (int i = 0; i < size; i++, pSrcData += 3)//{//将绿色通道反色,与b、g、r通道分别相乘,得到新的图层颜色g_alpha = 255 - pSrcData[GREEN];//将绿色通道反色b = pSrcData[BLUE] * g_alpha >> 8;g = pSrcData[GREEN] * g_alpha >> 8;r = pSrcData[RED] * g_alpha >> 8;//将上个步骤得到的新图层,与原始图做滤色混合,即执行f(a,b)=1-(1-a)*(1-b)的操作pSrcData[BLUE] = SCREEN_XY(pSrcData[BLUE], b);pSrcData[GREEN] = SCREEN_XY(pSrcData[GREEN], g);pSrcData[RED] = SCREEN_XY(pSrcData[RED], r);//如果发现使用一次照度增强后,图片仍然偏暗,再运行一次上述代码//如果觉得合适,就只增强一次即可g_alpha = 255 - pSrcData[GREEN];b = pSrcData[BLUE] * g_alpha >> 8;g = pSrcData[GREEN] * g_alpha >> 8;r = pSrcData[RED] * g_alpha >> 8;pSrcData[BLUE] = SCREEN_XY(pSrcData[BLUE], b);pSrcData[GREEN] = SCREEN_XY(pSrcData[GREEN], g);pSrcData[RED] = SCREEN_XY(pSrcData[RED], r);}return src;
}int main() {//方法一Mat src = imread("c:\\users\\fhgx\\desktop\\image\\1.jpg");imshow("原图", src);Mat out1=dark_light(src);imshow("增强后的图像", out1);Mat out;medianBlur(out1, out, 5);imshow("滤波后的图像", out);waitKey();return 0;
}

结果

code3

//=================================
/*
day:2021.5.20
低照度增强代码
*/
//=================================
#include <stdio.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <iostream>
#include <math.h>
#include <vector>
#include <string.h>
#include <fstream>using namespace cv;
using namespace std;Mat ALTM(Mat src)
{//--------------------------------//计算Lwmax(亮度最大值)float Lwmax = 0;//将cv:Mat转换成const cvArrIplImage tmp = cvIplImage(src);;CvArr* arr = (CvArr*)&tmp;CvScalar scalar;   //scalarfor (int i = 0; i <= src.rows - 1; ++i) {for (int j = 0; j <= src.cols - 1; ++j) {scalar = cvGet2D(arr, i, j);   //获取像素点的RGB颜色分量float Lw = 0.299f * scalar.val[2] + 0.587f * scalar.val[1] + 0.114f * scalar.val[0];if (Lw > Lwmax){Lwmax = Lw;}}}//cout << "Lwmax:" << Lwmax << endl;//-------------------------------------------------//计算Lwaver(亮度平均)float Lwaver;float sum = 0;for (int i = 0; i <= src.rows - 1; ++i) {for (int j = 0; j <= src.cols - 1; ++j) {scalar = cvGet2D(arr, i, j);  //获取像素点的RGB颜色分量float Lw = 0.299f * scalar.val[2] + 0.587f * scalar.val[1] + 0.114f * scalar.val[0];sum += log(0.001f + Lw);//cout << "sum:" << sum << endl;}}sum /= src.cols * src.rows;//cout << "sum:" << sum << endl;Lwaver = exp(sum);//对原图进行计算,并输出结果Mat newImage;newImage.create(src.size(), src.type());//将cv:Mat转换成const cvArrIplImage tmpNew = cvIplImage(newImage);CvArr* arrNew = (CvArr*)&tmpNew;//设置容器存放RGBvector<Mat> channels;for (int i = 0; i <= src.rows - 1; ++i) {for (int j = 0; j <= src.cols - 1; ++j) {scalar = cvGet2D(arr, i, j);    //获取像素点的RGB颜色分量float Lw = 0.299f * scalar.val[2] + 0.587f * scalar.val[1] + 0.114f * scalar.val[0];float Lg = log(Lw / Lwaver + 1) / log(Lwmax / Lwaver + 1);//cout << "Lg:" << Lg << endl;float gain = Lg / Lw;//cout << "gain:" << gain << endl;scalar.val[2] = scalar.val[2] * gain * 255;//Bscalar.val[1] = scalar.val[1] * gain * 255;//Gscalar.val[0] = scalar.val[0] * gain * 255;//R//float max0,max1,max2;//Mat color = merge([B,G,R]);//将cv:Mat转换成const cvArr//IplImage tmpNew = IplImage(newImage);//CvArr* arrNew = (CvArr*)&tmpNew;cvSet2D(arrNew,i,j, scalar);//cout << "scalar.val[2]:" << scalar.val[2] << endl;}}Mat img = cv::cvarrToMat(arrNew);imshow("低照度图像增强结果", img);return img;
}int main(int argc,char** argv)
{//提供了00和11两张图片,可以测试一下//Mat srcImage = imread("00.png", 1);Mat srcImage = imread("1.jpg", 1);if (srcImage.empty()){std::cout << "打开图片失败,请检查" << std::endl;return -1;}imshow("原图像", srcImage);//图片进行灰度化Mat greyImage;//cvtColor(srcImage, greyImage,CV_RGB2BGR);//imshow("灰度化", greyImage);//调用函数//ALTM(greyImage);ALTM(srcImage);//Mat dstIamge=ALTM(greyImage);//imshow("低照度增强", dstIamge);waitKey();return 0;
}

结果

暗光图像增强—opencv(C++)相关推荐

  1. 自监督的暗光图像增强

    [前言] 前几天吃了一下ICCV21的瓜,吃的有点饱,就去刷了一下arxiv,看到了一篇微软的工作,很有意思,是Mobilenet和Transformer的拼一起的网络架构,具体说就是这两个网络主干就 ...

  2. Low-light Enhancement暗光图像增强论文整理2019-2021

    Low-light Enhancement暗光图像增强论文整理2019-2021 github代码都放后面了,没有就是找不到代码 近年论文 Guo, Xiaojie et al. "LIME ...

  3. 基于零参考深度曲线估计的暗光图像增强

    天下事以难而废者十之一,以惰而废者十之九.--<严氏家训·议兵篇> 摘要: 本文提出了一种新的基于零参考深度曲线估计(Zero-DCE)的方法,该方法将光照增强描述为一种基于深度网络的特定 ...

  4. 【图像增强】基于matlab双边滤波retinex算法暗光图像增强【含Matlab源码 2305期】

    ⛄一.简介 1 Retinex 1.1 理论 Retinex理论始于Land和McCann于20世纪60年代作出的一系列贡献,其基本思想是人感知到某点的颜色和亮度并不仅仅取决于该点进入人眼的绝对光线, ...

  5. 【图像增强】双边滤波retinex算法暗光图像增强【含Matlab源码 2305期】

    ⛄一.简介 1 Retinex 1.1 理论 Retinex理论始于Land和McCann于20世纪60年代作出的一系列贡献,其基本思想是人感知到某点的颜色和亮度并不仅仅取决于该点进入人眼的绝对光线, ...

  6. Low-light images enhancement/暗光/低光/微光增强系列:Attention-guided Low-light Image Enhancement(详解)

    以下文字为博主翻译并添加了自己的理解,斜体为博主自己的想法,若有出错请指出. 摘要 暗光图像增强需要同时有效地处理颜色.亮度.对比度.伪影和噪声等多种因素.本文提出了一种新颖的注意力引导增强方案,并在 ...

  7. 超简单但又超有效的基于CNN的暗光成像模型

    [前言] 上次整了个google的纯传统算法的暗光成像的超复杂pipeline的paper,那个确实挺难的,这次我找到了个简单移动的用CNN的暗光成像的模型,复现难度应该会低很多. 以下解读与见解均为 ...

  8. 腾讯优图CVPR中标论文:不靠硬件靠算法,暗光拍照也清晰

    雷刚 发自 凹非寺  量子位 报道 | 公众号 QbitAI 暗光拍照也清晰,这是手机厂商目前激烈竞争的新拍照目标. 但除了堆摄像头和硬件,AI科学家带来算法方面的新突破. 他们提出基于深度学习优化光 ...

  9. Retinex算法在暗光增强应用以及Python实现

    图像暗光增强(一) Retinex简介 Single Scale Retinex(SSR) 多尺度MSR Multi-Scale Retinex 带色彩恢复的多尺度MSR,即MSRCR(Multi-S ...

最新文章

  1. 这个Python库可以偷懒,和import说再见!
  2. 判断是否在数组中,若在输入其下标,否则输入-1
  3. Flutter 34: 图解自定义 View 之 Canvas (一)
  4. java seek指针 换行符_Java网络编程探究|乐字节
  5. Android音频实时传输与播放(四):源码下载(问题更新)【转】
  6. C语言丨定积分的近似计算
  7. zabbix之 qq邮件报警
  8. django一对多 增 删 改 查
  9. CVPR2022 Oral | CosFace、ArcFace的大统一升级,AdaFace解决低质量图像人脸识
  10. java jxta_JXTA——JAVA P2P网络编程技术(入门篇) | 学步园
  11. 如果你想成为一名黑客
  12. 【芝麻背调百科】已婚员工入职新公司后申请休婚假,公司能否拒绝?
  13. python excel行列转置_用powershell+excel行列转置三步走
  14. 计算机方向键不能使用,电脑键盘中的数字按键不能用是什么原因?
  15. 植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(中)
  16. 【Paper-Attack】Graph Universal Adversarial Attacks: A Few Bad Actors Ruin Graph Learning Models
  17. Java 模拟鼠标、键盘--向可编辑窗口录入内容
  18. 企业微信登录报错:应用程序无法正常启动(0xc0000142);Win10应用程序无法正常启动0xc0000142错误的解决方法
  19. java 正则表达式验证
  20. 步进电机基础(2.1)- 定子相数的分类、结构、原理

热门文章

  1. uniapp分享到微信好友和朋友圈
  2. 扬帆际海—跨境电商有前途吗?
  3. dbForge Studio不能直接在可视化界面添加、修改和删除
  4. 基于STM32的频谱分析和波形识别系统
  5. react hooks之useCallback
  6. StopWatch—— 优雅的程序计时器
  7. Linux图形界面语言设置没有中文,输入法没有拼音怎么办
  8. 这几天买火车票的感想
  9. 为什么要使用 Rust 语言?Rust 语言的优势在哪里?
  10. 了解Rust语言(rust是什么)