前言

1.Retinex图像增强是一种高动态范围图像的新色调映射技术。而基础理论是,物体的颜色是由物体对长波(红色)、中波(绿色)、短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定的,物体的色彩不受光照非均匀性的影响,具有一致性,即retinex是以色感一致性(颜色恒常性)为基础的。不同于传统的线性、非线性的只能增强图像某一类特征的方法,Retinex可以在动态范围压缩、边缘增强和颜色恒常三个方面达到平衡,因此可以对各种不同类型的图像进行自适应的增强。
2.Retinex图像增强包括两个步骤,全局适应和人类视觉系统的局部自适应。在局部自适应过程中,这里使用引导滤波器代替原本的高斯滤波器以减少晕圈伪影。为了保证良好的再现和动态范围压缩,使用基于场景的亮度值的对比度增强因子。此外,引入自适应非线性偏移来处理对数函数的非线性强度。
3.导向滤波作为一种保边滤波,可以运用在很多场合,比如美颜,去雾。

代码实现

void ALTMRetinex(const Mat& src, Mat &dst, bool LocalAdaptation = false, bool ContrastCorrect = true)
{Mat temp, src_gray;src.convertTo(temp, CV_32FC3);//灰度图cvtColor(temp, src_gray, CV_BGR2GRAY);double LwMax;//得到最大值minMaxLoc(src_gray, NULL, &LwMax);Mat Lw_;const int num = src.rows * src.cols;//计算每个数组元素绝对值的自然对数cv::log(src_gray + 1e-3f, Lw_);//矩阵自然指数float LwAver = exp(cv::sum(Lw_)[0] / num);Mat Lg;log(src_gray / LwAver + 1.f, Lg);//矩阵除法cv::divide(Lg, log(LwMax / LwAver + 1.f), Lg);//局部自适应Mat Lout;if (LocalAdaptation){int kernelSize = floor(std::max(3, std::max(src.rows / 100, src.cols / 100)));Mat Lp, kernel = cv::getStructuringElement(MORPH_RECT, Size(kernelSize, kernelSize));cv::dilate(Lg, Lp, kernel);Mat Hg = guidedFilter(Lg, Lp, 10, 0.01f);double eta = 36;double LgMax;cv::minMaxLoc(Lg, NULL, &LgMax);Mat alpha = 1.0f + Lg * (eta / LgMax);Mat Lg_;cv::log(Lg + 1e-3f, Lg_);float LgAver = exp(cv::sum(Lg_)[0] / num);float lambda = 10;float beta = lambda * LgAver;cv::log(Lg / Hg + beta, Lout);cv::multiply(alpha, Lout, Lout);cv::normalize(Lout, Lout, 0, 255, NORM_MINMAX);}else{cv::normalize(Lg, Lout, 0, 255, NORM_MINMAX);}Mat gain(src.rows , src.cols, CV_32F);for (int i = 0; i < src.rows; i++){for (int j = 0; j < src.cols; j++){float x = src_gray.at<float>(i, j);float y = Lout.at<float>(i, j);if (0 == x) gain.at<float>(i, j) = y;else gain.at<float>(i, j) = y / x;}}Mat bgr[3];cv::split(temp, bgr);if (ContrastCorrect){// 校正图像对比度bgr[0] = (gain.mul(bgr[0] + src_gray) + bgr[0] - src_gray) *0.5f;bgr[1] = (gain.mul(bgr[1] + src_gray) + bgr[1] - src_gray) *0.5f;bgr[2] = (gain.mul(bgr[2] + src_gray) + bgr[2] - src_gray) *0.5f;}else{cv::multiply(bgr[0], gain, bgr[0]);cv::multiply(bgr[1], gain, bgr[1]);cv::multiply(bgr[2], gain, bgr[2]);}cv::merge(bgr, 3, dst);dst.convertTo(dst, CV_8UC3);
}//导向滤波器Mat guidedFilter(cv::Mat& I, cv::Mat& p, int r, float eps){/*× GUIDEDFILTER   O(N) time implementation of guided filter.××   - guidance image: I (should be a gray-scale/single channel image)×   - filtering input image: p (should be a gray-scale/single channel image)×   - local window radius: r×   - regularization parameter: eps*/cv::Mat _I;I.convertTo(_I, CV_32FC1);I = _I;cv::Mat _p;p.convertTo(_p, CV_32FC1);p = _p;//因为opencv自带的boxFilter()中的Size,比如9x9,我们说半径为4r = 2 * r + 1;//mean_I = boxfilter(I, r) ./ N;cv::Mat mean_I;cv::boxFilter(I, mean_I, CV_32FC1, cv::Size(r, r));//mean_p = boxfilter(p, r) ./ N;cv::Mat mean_p;cv::boxFilter(p, mean_p, CV_32FC1, cv::Size(r, r));//mean_Ip = boxfilter(I.*p, r) ./ N;cv::Mat mean_Ip;cv::boxFilter(I.mul(p), mean_Ip, CV_32FC1, cv::Size(r, r));//cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.cv::Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);//mean_II = boxfilter(I.*I, r) ./ N;cv::Mat mean_II;cv::boxFilter(I.mul(I), mean_II, CV_32FC1, cv::Size(r, r));//var_I = mean_II - mean_I .* mean_I;cv::Mat var_I = mean_II - mean_I.mul(mean_I);//a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper;cv::Mat a = cov_Ip / (var_I + eps);//b = mean_p - a .* mean_I; % Eqn. (6) in the paper;cv::Mat b = mean_p - a.mul(mean_I);//mean_a = boxfilter(a, r) ./ N;cv::Mat mean_a;cv::boxFilter(a, mean_a, CV_32FC1, cv::Size(r, r));//mean_b = boxfilter(b, r) ./ N;cv::Mat mean_b;cv::boxFilter(b, mean_b, CV_32FC1, cv::Size(r, r));//q = mean_a .* I + mean_b; % Eqn. (8) in the paper;cv::Mat q = mean_a.mul(I) + mean_b;return q;}

运行结果

结语

我这里使用的库OpenCV版本是3.30,关于opencv学习,有兴趣的看我之前发的博客,可以加之前博客后面给的兴趣群。

OpenCV图像增强(二)——Retinex图像增强相关推荐

  1. Retinex图像增强算法——SSR,MSR,MSRCR,MSRCP,autoMSRCR

    系列文章目录 关于OpenCV的一些图像处理函数 图象基本操作(读取.显示.通道提取.边界填充.融合.保存) Retinex图像增强算法--SSR,MSR,MSRCR,MSRCP,autoMSRCR ...

  2. MSRCR(Multi-Scale Retinex with Color Restore)多尺度Retinex图像增强

    引言 始于Edwin Herbert Land(埃德温·赫伯特·兰德)于1971年提出的一种被称为色彩恒常的理论,并基于此理论的图像增强方法.Retinex这个词由视网膜(Retina)和大脑皮层(C ...

  3. 【OpenCV 例程200篇】50. 图像增强—直方图统计量图像增强

    [OpenCV 例程200篇]50. 图像增强-直方图统计量图像增强 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  4. 基于色彩恒常( color constancy)特性的Frankle-McCann Retinex图像增强。

    from:https://www.cnblogs.com/Imageshop/archive/2013/04/18/3029352.html 基于色彩恒常( color constancy)特性的Fr ...

  5. OpenCV,马赛克 常用图像增强算法的实现

    import cv2 import numpy as npdef salt(img, img2, n):noff = int((n - 1) / 2)for i in range(noff,img.s ...

  6. 关于Retinex图像增强算法的一些新学习

    关于Retinex图像增强算法的一些新学习. - Imageshop 时间 2014-06-26 16:50:00  博客园精华区 原文  http://www.cnblogs.com/Imagesh ...

  7. opencv 一种灰度图像增强方式

    opencv 取灰度图颜色范围 opencv有自己的图像增强函数,这里提出一种定义范围颜色的增强方式, 下面是opencv自带直方图增强的函数,equalizeHist,如果需要三通道增强,可以分别取 ...

  8. 荔枝hsv空间图像分割程序matlab,基于Retinex图像增强的不同光照条件下的成熟荔枝识别_熊俊涛...

    第29卷第12期农业工程学报V ol.29 No.12 170 2013年6月Transactions of the Chinese Society of Agricultural Engineeri ...

  9. 通过Java使用opencv识别二维码

    OpenCV的全称是Open Source Computer Vision Library,它是一个跨平台的计算机视觉库,由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费 ...

最新文章

  1. python详细安装教程linux-python 在linux系统的安装教程
  2. Java 异常Exception
  3. SpringSecurity remeber功能源码跟踪
  4. Spring-读取properties文件
  5. Android中为APP创建快捷方式的原理(自己的理解)
  6. 软件2班36人[扑林作]
  7. pyqtSignal信号和槽
  8. 学习PHP的必备开发工具
  9. 服务器2003系统序列号,Windows Server 2003 R2 With Sp2 序列号
  10. python 线程池 锁_python 线程池和锁
  11. 一个计算机能插两块显卡吗,双显卡有什么好处(一台电脑安装两张不同的显卡)...
  12. 医药行业如何数字化转型 附医药行业数字化转型方案
  13. view的superview的变换
  14. delphi Use MSBuild externally to compile 无法DEBUG
  15. 关于个人的年度小目标
  16. Virtualbox安装Kylin 10后调整屏幕分辨率无法选中保存按钮
  17. DB、DBMS、SQL分别是什么,有什么关系?
  18. 如何正确解决win10系统下C盘空间不能扩展的问题!
  19. 中国煤矿机械行业市场动态调研及未来发展方向分析报告2022-2028年
  20. 在西雅图华盛顿大学 (University of Washington) 就读是怎样一番体验?

热门文章

  1. module 'schedule' has no attribute 'every
  2. 区域内点的个数_JAVA
  3. Dubbo 源码分析 - 集群容错之 Cluster
  4. MyBatis 源码分析 - 插件机制
  5. 【C#学习】delegate(委托) 和 event(事件)
  6. JVM垃圾回收算法 总结及汇总
  7. 如何将eclipse设置为炫丽的全黑背景!
  8. 理解LSTM 网络Understanding LSTM Networks
  9. 常微分方程数值解:欧拉公式
  10. 给在读研究生的一封信(强烈推荐)