参考

亮度和对比度调节公式,其中alpha负责对比度,beta负责亮度。

O(x,y) = alpha * I(x,y) + beta

如果想要自动调节亮度和对比度,意味着自动调节 alphabeta
假如想要将最小值变到0,最大值变为255,则计算公式如下。

input range = max(I) - min(I)
wanted output range = 255;
alpha = output range / input range = 255 / ( max(I) - min(I) )
min(O) = alpha * min(I) + beta
beta = -min(I) * alpha

直方图剪枝平移

  • 平移 -> 亮度
  • 剪枝 -> 重定义直方图的范围

下面的图以供理解

代码实现

这里我增加了两个参数,用以调节亮度最低值和直方图的范围

// clipHistPercent 剪枝(剪去总像素的多少百分比)
// histSize 最后将所有的灰度值归到多大的范围
// lowhist 最小的灰度值
void BrightnessAndContrastAuto(const cv::Mat &src, cv::Mat &dst, float clipHistPercent=0, int histSize = 255, int lowhist = 0)
{CV_Assert(clipHistPercent >= 0);CV_Assert((src.type() == CV_8UC1) || (src.type() == CV_8UC3) || (src.type() == CV_8UC4));float alpha, beta;double minGray = 0, maxGray = 0;//to calculate grayscale histogramcv::Mat gray;if (src.type() == CV_8UC1) gray = src;else if (src.type() == CV_8UC3) cvtColor(src, gray, CV_BGR2GRAY);else if (src.type() == CV_8UC4) cvtColor(src, gray, CV_BGRA2GRAY);if (clipHistPercent == 0){// keep full available rangecv::minMaxLoc(gray, &minGray, &maxGray);}else{cv::Mat hist; //the grayscale histogramfloat range[] = { 0, 256 };const float* histRange = { range };bool uniform = true;bool accumulate = false;calcHist(&gray, 1, 0, cv::Mat (), hist, 1, &histSize, &histRange, uniform, accumulate);// calculate cumulative distribution from the histogramstd::vector<float> accumulator(histSize);accumulator[0] = hist.at<float>(0);for (int i = 1; i < histSize; i++){accumulator[i] = accumulator[i - 1] + hist.at<float>(i);}// locate points that cuts at required valuefloat max = accumulator.back();int clipHistPercent2;clipHistPercent2 = clipHistPercent * (max / 100.0); //make percent as absoluteclipHistPercent2 /= 2.0; // left and right wings// locate left cutminGray = 0;while (accumulator[minGray] < clipHistPercent2)minGray++;// locate right cutmaxGray = histSize - 1;while (accumulator[maxGray] >= (max - clipHistPercent2))maxGray--;}// current rangefloat inputRange = maxGray - minGray;alpha = (histSize - 1) / inputRange;   // alpha expands current range to histsize rangebeta = -minGray * alpha + lowhist;             // beta shifts current range so that minGray will go to 0// Apply brightness and contrast normalization// convertTo operates with saurate_castsrc.convertTo(dst, -1, alpha, beta);// restore alpha channel from sourceif (dst.type() == CV_8UC4){int from_to[] = { 3, 3};cv::mixChannels(&src, 4, &dst,1, from_to, 1);}
}

【图像增强】自适应亮度对比度调节算法C++相关推荐

  1. 局部自适应自动色阶/对比度算法在图像增强上的应用

    本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/3395968.html  侵 ...

  2. 基于特征点匹配的自适应目标跟踪算法

    基于特征点匹配的自适应目标跟踪算法 2016-01-29 13:11 摘 要:由于实际场景复杂多变,目标在运动过程中往往会出现形变.遮挡等问题,增加了跟踪的难度.为了解决上述问题,提出一种基于特征点匹 ...

  3. opencv进阶学习笔记3:像素运算和图像亮度对比度调节

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...

  4. C++Adaline自适应线性神经网络算法(附完整源码)

    C++Adaline自适应线性神经网络算法 C++Adaline自适应线性神经网络算法完整源码(定义,实现,main函数测试) C++Adaline自适应线性神经网络算法完整源码(定义,实现,main ...

  5. OpenCV局部阙值分割的自适应阙值算法

    前言: 当图片中的照明出现不均匀的情况时,图像的灰度值就会出现灰度值不均匀,如果我们采用全局阙值分割,对所有像素值共用同一个阙值,往往无法得到理想的分割.而局部阙值分割则可以解决这个问题,它所提供的思 ...

  6. 波束赋形技术lms算法在matlab仿真,自适应波束成形算法LMS、RLS、VSSLMS分解

    1.传统的通信系统中,基站天线通常是全向天线,此时,基站在向某一个用户发射或接收信号时,不仅会造成发射功率的浪费,还会对处于其他方位的用户产生干扰.然而,虽然阵列天线的方向图是全向的,但是通过一定技术 ...

  7. 几类自适应波束形成算法推导

    波束形成是声纳或者雷达信号处理的一个重要的步骤,它旨在使接收的阵列能够按照期望的方向接收信号,并且抑制其它方向信号的干扰.自适应波束形成往往具有比常规波束形成更尖的指向性和抗强干扰能力.在一些情况下更 ...

  8. 模拟PWM波的自适应取阈值算法

    模拟PWM波的自适应取阈值算法 前言:   单片机开发中,我们常常接触到的波形就是PWM波,一般都是0~3.3V的数字PWM波,很少涉及模拟PWM波.两者有什么不同呢?模拟PWM波不只有高低电平,还有 ...

  9. 阵列信号处理——LMS自适应波束形成算法

    一.LMS自适应波束形成算法 最小均方算法(LMS)采用迭代模式,在每个迭代步骤n时刻的权向量加上一个校正量后,即组成n + 1时刻的权向量,用它逼近最佳权向量.LMS自适应波束形成算法如下表所示: ...

最新文章

  1. python封装方法有几种_Python中的封装有什么作用?
  2. 离线版的SAP中F1帮助
  3. Linux的ps aux/ps -ef:风格不同
  4. C# NPOI(xlsx相关操作)
  5. 机器学习面试- Scikit-learn
  6. hydra-字典暴力破解
  7. 深圳市科技创新委员会关于2021年高新技术企业培育库拟入库企业名单公示的通知
  8. 认识Snort3 (1):编译、安装与简单使用
  9. [Android Studio] 添加Override/Implement methods
  10. 详解 Win8 KMS 激活原理_-Chaz-_新浪博客
  11. 基于easyui的 增 删 改 查
  12. 计算机的组策略配置在什么时候生效,修改组策略生效时间
  13. 内存泄漏工具asan
  14. 做个男人,做个成熟的男人
  15. jpi多表联查_多表连接查询详解
  16. FPGA串口之RS-485
  17. qq空间播放器肤代码
  18. 开源的GNSS软件接收机工程汇总
  19. Spark 中 JVM 内存使用及配置详情、spark报错与调优、Spark内存溢出OOM异常
  20. mac idea 配置 cmd+ 向上/向下 移动光标到 首/尾行

热门文章

  1. ​生成扩散模型漫谈:构建ODE的一般步骤(下)
  2. 前端性能测试lighthouse的使用
  3. 高仿支付宝钱包九宫格解锁
  4. QString将16进制字符串转换成10进制字符串(16进制IP地址的转换显示)
  5. 【转】paypal争议/投诉
  6. 水安ABC考试多选练习题库(4)
  7. 网站安全扫描工具(AppScan7.8/JSky)
  8. UnblockNeteaseMusic手机端使用教程
  9. 天津室内3DMAX培训自学还是报班?哪家好?
  10. 15种惊人的White App设计创意可激发你的想象力