《Contrast image correction method》 论文阅读及代码实现

以下内容大部分引自:https://cloud.tencent.com/developer/article/1558535

前言

这是OpenCV图像处理专栏的第七篇文章,这篇文章是在之前的推文 OpenCV图像处理专栏二 |《Local Color Correction 》论文阅读及C++复现基础上进行了改进,仍然针对数字图像的光照不均衡现象进行校正。

算法原理

首先在《Local Color Correction》中有指数部分为,具体去看上篇文章,这篇论文优化了2个地方:

第一,高斯模糊的mask使用双边滤波来代替,因为双边滤波的保边特性,可以更好的保持边缘信息。
第二,常数2使用来代替,并且是和图像内容相关的,当图像的整体平均值小于128时,使用:计算,当平均值大于128时,使用,意思就是说对于低对比度的图像,应该需要比较强的矫正幅度,所以应该偏大,反之对于高对比度的图像,只需要较弱的校正幅度。
但是这里有个trick,就是说对于第二条,实际上存在很大的问题,比如对于我们下面测试的原图,由于他上半部分为天空,下半部分比较暗,且基本各占一般,因此其平均值非常靠近128,因此计算出的α也非常接近1,这样如果按照改进后的算法进行处理,则基本上图像无什么变化,显然这是不符合实际的需求的,因此,个人认为作者这一改进是不合理的,还不如对所有的图像该值都取2,靠mask值来修正对比度,我实现的代码也是取了2。

算法实现

接下来我们实现算法需要对RGB图像进行处理,我们可以像我之前那篇推文那样对RGB通道分别处理,但是可能会存在色偏,所以可以在YUV或者CIELAB等等空间只对亮度的通道进行处理,最后再转回RGB,并且作者提出在对Y分量做处理后,再转换到RGB空间,图像会出现饱和度一定程度丢失的现象,看上去图像似乎色彩不足。所以论文提出了一个修正的公式为:
{R′=12[Y′Y(R+Y)+R−Y]G′=12[Y′Y(G+Y)+G−Y]B′=12[Y′Y(B+Y)+B−Y]\begin{cases} R'=\frac{1}{2} \begin{bmatrix}\frac{Y'}{Y}(R+Y)+R-Y\end{bmatrix} \\ G'=\frac{1}{2} \begin{bmatrix}\frac{Y'}{Y}(G+Y)+G-Y\end{bmatrix} \\ B'=\frac{1}{2} \begin{bmatrix}\frac{Y'}{Y}(B+Y)+B-Y\end{bmatrix} \\ \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧​R′=21​[YY′​(R+Y)+R−Y​]G′=21​[YY′​(G+Y)+G−Y​]B′=21​[YY′​(B+Y)+B−Y​]​

C++代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace cv;
using namespace std;Mat ContrastImageCorrection(Mat src)
{int rows = src.rows;int cols = src.cols;Mat yuvImg;cvtColor(src, yuvImg, CV_BGR2YUV_I420);vector <Mat> mv;split(yuvImg, mv);Mat OldY = mv[0].clone();//    for(int i = 0; i < rows; i++){//        for(int j = 0; j < cols; j++){//            mv[0].at<uchar>(i, j) = 255 - mv[0].at<uchar>(i, j);//        }//    }Mat temp;bilateralFilter(mv[0], temp, 9, 50, 50);//GaussianBlur(mv[0], temp, Size(41, 41), BORDER_DEFAULT);for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {float Exp = pow(2, (128 - (255 - temp.at<uchar>(i, j))) / 128.0);int value = int(255 * pow(OldY.at<uchar>(i, j) / 255.0, Exp));temp.at<uchar>(i, j) = value;}}Mat dst(rows, cols, CV_8UC3);//    mv[0] = temp;//    merge(mv, dst);//    cvtColor(dst, dst, CV_YUV2BGRA_I420);for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++){if (OldY.at<uchar>(i, j) == 0) {for (int k = 0; k < 3; k++) dst.at<Vec3b>(i, j)[k] = 0;}else {//channel Bdst.at<Vec3b>(i, j)[0] =(temp.at<uchar>(i, j) * (src.at<Vec3b>(i, j)[0] + OldY.at<uchar>(i, j)) / OldY.at<uchar>(i, j) +src.at<Vec3b>(i, j)[0] - OldY.at<uchar>(i, j)) >> 1;//channel Gdst.at<Vec3b>(i, j)[1] =(temp.at<uchar>(i, j) * (src.at<Vec3b>(i, j)[1] + OldY.at<uchar>(i, j)) / OldY.at<uchar>(i, j) +src.at<Vec3b>(i, j)[1] - OldY.at<uchar>(i, j)) >> 1;//channel Rdst.at<Vec3b>(i, j)[2] =(temp.at<uchar>(i, j) * (src.at<Vec3b>(i, j)[2] + OldY.at<uchar>(i, j)) / OldY.at<uchar>(i, j) +src.at<Vec3b>(i, j)[2] - OldY.at<uchar>(i, j)) >> 1;}}}//    for(int i = 0; i < rows; i++)//    {//        for(int j = 0; j < cols; j++)//       {//            for(int k = 0; k < 3; k++)//            {//                if(dst.at<Vec3b>(i, j)[k] < 0)//                {//                    dst.at<Vec3b>(i, j)[k] = 0;//                }//                else if(dst.at<Vec3b>(i, j)[k] > 255)//                {//                    dst.at<Vec3b>(i, j)[k] = 255;//                }//            }//        }//    }return dst;
}int main()
{Mat src = imread("1.jpg");Rect rect(0, 0, (src.cols - 1) / 2 * 2, (src.rows - 1) / 2 * 2); //保证长宽都是偶数Mat newsrc = src(rect);Mat dst = ContrastImageCorrection(newsrc);imshow("origin", newsrc);imshow("result", dst);waitKey(0);return 0;
}

效果

论文原文:https://www.researchgate.net/publication/220051147_Contrast_image_correction_method

OpenCV图像处理算法——7(《Contrast image correction method》 论文阅读及代码实现)相关推荐

  1. python opencv图像处理算法之GrabCut算法

    GrabCut算法 通常情况下,我们需要图像进行前景后景进行分离,有的时候也许我们仅仅是需要前景.本次教程我们将介绍GrabCut算法进行交互式前景提取. GrabCut是一种基于图切割的图像分割方法 ...

  2. 长期跟踪经典之作2--- LCT 算法论文阅读与代码运行

    好了  TLD很费劲地弄完了,现在开始进阶的SHJT大神的LCT,就是长期追踪,我相信未来这个方向会火起来的. 这两天琢磨完了论文,这里罗列一下读论文主要需要参阅的: 1 STC (用到了时空上下文分 ...

  3. OpenCV图像处理专栏十七 | 清华大学《基于单幅图像的快速去雾》C++复现(有一定工程意义)

    代码开源在 https://github.com/BBuf/Image-processing-algorithm,感兴趣给我来个星星呗. 1. 前言 这是OpenCV图像处理算法朴素实现专栏的第17篇 ...

  4. 【CV春季划】170分钟学习OpenCV与经典图像处理算法基础

    本次给大家带来的是有三AI-CV春季划组OpenCV与经典图像处理算法的直播回放,如果你还不知道有三AI-CV春季划是什么,可以看下面的视频和图文. 点击边框调出视频工具条 [CV春季划]言有三手把手 ...

  5. 【OpenCV图像处理入门学习教程六】基于Python的网络爬虫与OpenCV扩展库中的人脸识别算法比较

    OpenCV图像处理入门学习教程系列,上一篇第五篇:基于背景差分法的视频目标运动侦测 一.网络爬虫简介(Python3) 网络爬虫,大家应该不陌生了.接下来援引一些Jack-Cui在专栏<Pyt ...

  6. OpenCV图像处理专栏九 | 基于直方图的快速中值滤波算法

    转载自:https://zhuanlan.zhihu.com/p/98092747  侵删 前言 这是OpenCV图像处理专栏的第9篇文章,主要介绍一个基于直方图的快速中值滤波算法,希望对大家有帮助. ...

  7. opencv图像处理之K-means聚类算法

    opencv图像处理之K-means聚类算法 opencv图像处理之K-means聚类算法 kmeans算法过程与简单的理解 基于Opencv的c++代码 opencv图像处理之K-means聚类算法 ...

  8. 你真的理解图像处理算法SIFT吗?

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者 | LYP2020 来源 | 知乎,https://z ...

  9. camerax_Android CameraX OpenCV图像处理

    camerax In this tutorial, we'll be integrating OpenCV in our Android Application. We have already di ...

最新文章

  1. Handlebars模板引擎
  2. insert 语句常见问题
  3. php+mysql分库分表的哈希(hash)算法
  4. url的关键字不知道是uft-8还是GBK
  5. c++的头文件与源文件
  6. 渐入“衰”境:警惕企业的六大老人病
  7. JDK内置的进制转换
  8. 玉林中专计算机专业,玉林最好的中专学校有哪些 十大中专学校排名
  9. Netty : netty 3如何解决空轮询bug
  10. 学java出来工作会很忙吗?
  11. 使用C#中的反射从字符串获取属性值
  12. 苹果Mac开启root用户及切换到root用户的方法
  13. 常用开关稳压电源(LM2596、MC3406)
  14. 标准c语言教程gary,C语言标准教程
  15. chrome浏览器完整保存整个网页 可离线访问
  16. Js、Jquery对goTop功能的实现
  17. Python3之入门小程序
  18. 计算机系女生电脑买什么牌子,适合女生的笔记本电脑 大学女生买什么电脑好...
  19. 线性光耦原理与电路设计
  20. css 下拉框 下三角形

热门文章

  1. 名悦集团介绍真正懂车的人不买白色的原因
  2. HTML5期末大作业:旅游网页设计与实现——旅游风景区网站HTML+CSS (1)
  3. python拨号_python 宽带拨号
  4. 怎么添加附件链接到微信公众号推文
  5. 西门子s7300 C MATLAB,西门子S7-300PLC的程序上载到电脑-工业支持中心-西门子中国...
  6. 鸿蒙系统有哪些手机可以应用,鸿蒙系统手机有哪些
  7. WEB 免费打印控件推荐
  8. 【强化学习】Q-Learning算法详解
  9. Ceph部署(二)RGW搭建
  10. 如何为Mac找到最合适的下载器