文章目录

  • 1. 调整图像亮度和对比度的原理
  • 2. python实现的一个代码如下,可以直接运行
  • 3. 在opencv种调节图像和对比度的方法
    • a. opencv中的实现方法:
    • b. 根据咱们的公式,我们也可以得到自己的a,b系数,实现结果表明和opencv的方法具有类似的效果
    • c.两种方案的完整demo,c++实现:

1. 调整图像亮度和对比度的原理

通过设计一个映射曲线就可完成对比度、亮度调整,具体过程如下图所示,
a) 为原图;
b) 把亮度调高,像素强度+固定值;
c) 把亮度调低,像素强度-固定值;
d) 增大像素强度75附近的对比度;增大附近的斜率
e) 增大像素强度150附近的对比度;
f) 增大像素强度75和225附近的对比度。

曲线斜率大于45度角的区域灰度被拉伸、精度上升、对比度变高;
曲线斜率小于45度角的区域灰度被压缩、精度下降、对比度变低。

下面图像是 0-255 映射到 0-255, a原图,b原图加上一个数,c原图减去一个数,d在value=75处拉伸,e在value=150出拉伸,f在75和225出进行拉伸。拉伸操作可以提升该区域的对比度

opencv关于对比度和亮度的误解

2. python实现的一个代码如下,可以直接运行

首先减去均值,然后调整对比度(乘上大于1的系数进行拉伸),然后加上均值,最后调整亮度。
aa是拉伸系数,bb是亮度变化
img_a = aa * (img - bri_mean) + bb + bri_mean

import cv2
import numpy as np
from matplotlib import pyplot as pltif __name__ == "__main__":file = r'D:\dataset\data_gain1_2\cap_frame_0002_raw.png'img = cv2.imread(file).astype(np.float32)bri_mean = np.mean(img)a = np.arange(5, 16, 5) / 10b = np.arange(-30, 31, 30)a_len = len(a)b_len = len(b)print(a_len, b_len)plt.figure()for i in range(a_len):for j in range(b_len):aa = a[i]bb = b[j]img_a = aa * (img-bri_mean) + bb + bri_meanprint(i, j, aa, bb)img_a = np.clip(img_a,0,255).astype(np.uint8)plt.subplot(a_len+1, b_len, (j + b_len * i + 1))plt.imshow(img_a, cmap='gray')plt.subplot(a_len + 1, b_len, a_len*b_len+1)plt.imshow(img.astype(np.uint8), cmap='gray')plt.show()

得到不同亮度和对比度的结果

3. 在opencv种调节图像和对比度的方法

可以参考下面链接的demo code:
opencv demo code
运行程序,对应直方图的变化:
原图

增加亮度,直方图向右平移

增加对比度, 直方图更加均衡

a. opencv中的实现方法:

首先认识 convertTo函数

image.convertTo(dst, CV_8U, a, b);

converTo 中的a,b是相乘和相加系数

opencv里是这样得到 a,b系数的
opencv中时如何求 alpha和beta的?如下:

if (contrast > 0)
{delta = 127. * contrast / 100;a = 255. / (255. - delta * 2);b = a * (brightness - delta);
}
else
{delta = -128. * contrast / 100;a = (256. - delta * 2) / 255.;b = a * brightness + delta;
}

b. 根据咱们的公式,我们也可以得到自己的a,b系数,实现结果表明和opencv的方法具有类似的效果

img_a = aa * (img - bri_mean) + bb + bri_mean
bri_mean锚定为127的时候
img_a = aa * (img - 127) + bb + 127 = aa * img - 127*aa + bb + 127 = aa * img + (1-aa) * 127 + bb

opencv中_brightness 和 _contrast 的范围是 0-200, 等于100时不进行调整, 参考和运行下面的demo程序

a = _contrast / 100.0f;
b = (1 - a) * 127 + _brightness - 100;

通过对比直方图的变化效果 可知上面两个方法 作用是类似的。
本来想找opencv的方法对应的原理链接,但是链接已经失效

c.两种方案的完整demo,c++实现:

#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"#include <iostream>using namespace cv;
using namespace std;int _brightness = 100;
int _contrast = 100;Mat image;/* brightness/contrast callback function */
static void updateBrightnessContrast(int /*arg*/, void*)
{int histSize = 64;int brightness = _brightness - 100;int contrast = _contrast - 100;/** The algorithm is by Werner D. Streidt* (http://visca.com/ffactory/archives/5-99/msg00021.html)*/double a, b;double delta=0;//opencv中的方法if (contrast > 0){delta = 127. * contrast / 100;a = 255. / (255. - delta * 2);b = a * (brightness - delta);}else{delta = -128. * contrast / 100;a = (256. - delta * 2) / 255.;b = a * brightness + delta;}/*method 2*/ //a = _contrast / 100.0f;//b = (1 - a) * 127 + _brightness - 100;//printf("ab value :%.4lf, %.4lf, %.4lf\n",delta, a, b);Mat dst, hist;image.convertTo(dst, CV_8U, a, b);imshow("image", dst);calcHist(&dst, 1, 0, Mat(), hist, 1, &histSize, 0);Mat histImage = Mat::ones(200, 320, CV_8U) * 255;normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, CV_32F);histImage = Scalar::all(255);int binW = cvRound((double)histImage.cols / histSize);for (int i = 0; i < histSize; i++)rectangle(histImage, Point(i * binW, histImage.rows),Point((i + 1) * binW, histImage.rows - cvRound(hist.at<float>(i))),Scalar::all(0), -1, 8, 0);imshow("histogram", histImage);
}const char* keys =
{"{help h||}{@image|baboon.jpg|input image file}"
};int main(int argc, const char** argv)
{CommandLineParser parser(argc, argv, keys);parser.about("\nThis program demonstrates the use of calcHist() -- histogram creation.\n");if (parser.has("help")){parser.printMessage();return 0;}string inputImage = parser.get<string>(0);// Load the source image. HighGUI use.image = imread(samples::findFile(inputImage), IMREAD_GRAYSCALE);if (image.empty()){std::cerr << "Cannot read image file: " << inputImage << std::endl;return -1;}namedWindow("image", 0);namedWindow("histogram", 0);createTrackbar("brightness", "image", &_brightness, 200, updateBrightnessContrast);createTrackbar("contrast", "image", &_contrast, 200, updateBrightnessContrast);updateBrightnessContrast(0, 0);waitKey();return 0;
}

opencv中如何调整图像亮度和对比度,以及亮度和对比度调整的原理相关推荐

  1. 【OpenCV学习】【7】图像的亮度和对比度操作

    如果我们需要增加图像的亮度或者减少图像的亮度,可以首先先创建一个和原图像一样大小的空白图像,然后进行加减操作即可增加或减小亮度! import cv2 import numpy as npimage ...

  2. opencv调整图像亮度和对比度

    全局变量 Mat adjMat,srcImg; int bright,constrast; adjMat为调整后图像,srcImg为调整前图像 bright为调整亮度,从0-300,像素值加上亮度值后 ...

  3. python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 亮度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和 ...

  4. 2021-01-07 python opencv调节图片亮度与对比度

    python opencv调节图片亮度与对比度 度调整是将图像像素的强度整体变大/变小,对比度调整指的是图像暗处变得更暗,亮出变得更亮,从而拓宽某个区域内的显示精度. 创建两个滑动条分别调整对比度和亮 ...

  5. OpenCV C++ 图像对比度和亮度

    目录 知识点 亮度和对比度调整原理 示例代码 reference 知识点 在本文中将了解到以下几个方面的内容: 1.C++ OpenCV访问像素值:2.用0初始化矩阵:3.saturate_cast起 ...

  6. office word中利用宏编程批量调节图片的亮度和对比度

    Sub '调节亮度和对比度()' 调节亮度和对比度 宏For i = 1 To ActiveDocument.InlineShapes.Count'0~1对应-100%~100%范围ActiveDoc ...

  7. OpenCV学习笔记之改变图像的对比度和亮度

    一.图像对比度和亮度 图像对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小.差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就 ...

  8. 调整计算机对比度,解决方案:如何调整计算机显示器的亮度和对比度

    您知道如何调整计算机显示器的亮度和对比度吗?以下是如何调整雪书编辑器带来的计算机显示器的亮度和对比度的内容.欢迎阅读! 如何调整计算机显示器的亮度和对比度? 计算机屏幕的亮度实际上非常简单.您可以选择 ...

  9. Python-OpenCV——亮度和对比度

    亮度计算:Y(亮度) = 0.299*R + 0.587*G + 0.114*B 也可以根据这个计算亮度: https://blog.csdn.net/cruoni/article/details/8 ...

  10. Chapter_06 更改图像的对比度和亮度

    文章目录 一. 本章目标 ① 目标 ② 理论 ③ 代码 二. 实例 ① 亮度和对比度调整 ② 伽马校正 ③ 纠正曝光不足的图像 三. 图形渲染中的伽马校正(附加资源) 一. 本章目标 ① 目标 本教程 ...

最新文章

  1. linux 网络配置 阮一峰,计算机是怎样启动的? - 阮一峰的网络日志.pdf
  2. mac的终端下面使用ssh user@localhost输入密码 不能正常登录
  3. NC:MetaSort通过降低微生物群落复杂度以突破宏基因组组装难题
  4. CTFshow php特性 web146
  5. TOA定位算法的FPGA实现
  6. Spring IoC 源码导读
  7. C/C++函数调用的几种方式总结
  8. 完善区块链产业链 加速经济数字化转型
  9. 是不正确的python语句_Python if语句读取不正确
  10. Arcface 总结
  11. 每天晚上坚持1500个跳绳,两个月后,身体会有什么变化?
  12. django celer_Celer招募Zing作为下一代基于Java的交易平台
  13. 学习html的心得总结
  14. DIY制作高精度低温漂电阻箱0.1~9.9GΩ(1)-- 项目介绍
  15. 进制转换之二进制与十进制转换
  16. 原生js实现地址选择组件(三级联动)
  17. 3ds MAX 灯光
  18. 记账本典型用户和使用场景分析
  19. ovftool工具的使用
  20. Typora 数学符号

热门文章

  1. 线材接头01——金属电缆防水接头
  2. 模型计算机微指令总表,计算机组成与结构微指令表(总).doc
  3. 选择工作,还是生活?
  4. 最全C#自学资源汇总
  5. mysql 乱码 越南_记一次Unipack越南文乱码Bug的修复
  6. Dairy?Diary!
  7. P2102 地砖铺设(dfs贪心)
  8. 【JavaSE】throws 异常处理
  9. 【ESP32学习笔记】#通用篇#(1)简介及资料
  10. 看完这篇 教你玩转渗透测试靶机vulnhub——FunBox3(Easy)