opencv调整图像亮度对比度的示例代码


Posted in Python onSeptember 27, 2019

图像处理

图像变换就是找到一个函数,把原始图像矩阵经过函数处理后,转换为目标图像矩阵.

可以分为两种方式,即像素级别的变换和区域级别的变换

  • Point operators (pixel transforms)
  • Neighborhood (area-based) operators

像素级别的变换就相当于\(p_{after}(i,j) = f(p_{before}(i,j))\),即变换后的每个像素值都与变换前的同位置的像素值有个函数映射关系.

对比度和亮度改变

线性变换  

最常用的是线性变换.即\(g(i,j) = \alpha \cdot f(i,j) + \beta\)
f(i,j)是原像素值,g(i,j)是变换后的像素值.
\(\alpha\)调整对比度,\(\beta\)调整亮度.有时也称之为gain和bias参数.

对比度是什么?不就是"亮和暗的区别"吗?也就是像素值的大小的区别.那我乘以一个alpha系数,当alpha很大的时候就是放大了这种亮度值的差异,也就是提高了对比度,当alpha很小时,也就是缩小了亮度的差异,也就是缩小了对比度.

beta就更好理解了,直接在像素的亮度值上加上一个数,正数就是提高亮度,负数降低亮度.

看一下下面代码的示例:

from __future__ import print_function
from builtins import input
import cv2 as cv
import numpy as np
import argparse
# Read image given by user
parser = argparse.ArgumentParser(description='Code for Changing the contrast and brightness of an image! tutorial.')
parser.add_argument('--input', help='Path to input image.', default='lena.jpg')
args = parser.parse_args()
image = cv.imread(cv.samples.findFile(args.input))
if image is None:
  print('Could not open or find the image: ', args.input)
  exit(0)
new_image = np.zeros(image.shape, image.dtype)
alpha = 1.0 # Simple contrast control
beta = 0  # Simple brightness control
# Initialize values
print(' Basic Linear Transforms ')
print('-------------------------')
try:
  alpha = float(input('* Enter the alpha value [1.0-3.0]: '))
  beta = int(input('* Enter the beta value [0-100]: '))
except ValueError:
  print('Error, not a number')
# Do the operation new_image(i,j) = alpha*image(i,j) + beta
# Instead of these 'for' loops we could have used simply:
# new_image = cv.convertScaleAbs(image, alpha=alpha, beta=beta)
# but we wanted to show you how to access the pixels :)
for y in range(image.shape[0]):
  for x in range(image.shape[1]):
    for c in range(image.shape[2]):
      new_image[y,x,c] = np.clip(alpha*image[y,x,c] + beta, 0, 255)
cv.imshow('Original Image', image)
cv.imshow('New Image', new_image)
# Wait until user press some key
cv.waitKey()

提示module 'cv2' has no attribute 'samples'的话要先安装pip install opencv-python==4.0.0.21.

执行:python change_brightness_contrast.py --input ./lights.jpeg

opencv调整图像亮度对比度的示例代码

上图是alpha=2,beta=20的一个效果图.

非线性变换

opencv调整图像亮度对比度的示例代码

线性变换有个问题,如上图,α=1.3 and β=40,提高原图亮度的同时,导致云几乎看不见了.如果要看见云的话,建筑的亮度又不够.

这个时候就引入了非线性变换. 称之为Gamma correction

\(O = \left( \frac{I}{255} \right)^{\gamma} \times 255\)

与线性变换不同,对不同的原始亮度值,其改变强度是不同的,是非线性的.

opencv调整图像亮度对比度的示例代码

在 γ<1的时候,会提高图片亮度.>1时,降低亮度.

opencv调整图像亮度对比度的示例代码

γ=0.4的变换效果图如上.可以看到云层及建筑变亮的同时还保持了对比度让图像依然清晰.

opencv调整图像亮度对比度的示例代码

如果查看不同变换下的灰度直方图的话可以看到.中间是原图的灰度直方图,可以看到低亮度值的像素点很多.
左边是做了线性变换的,整体直方图产生了右移,并且在255处出现峰值.因为每个像素点都增加了亮度嘛.导致了白云和蓝天过于明亮无法区分.

而右边做了gamma校正的图像亮度分布比较均匀,即使得低亮度值的部分得以加强,又不至于过度曝光使得白云无法区分.

实现Gamma correction的代码如下.

lookUpTable = np.empty((1,256), np.uint8)
  for i in range(256):
    lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255)
  res = cv.LUT(img_original, lookUpTable)

其中cv.LUT就是个变换函数.从lookUpTable里找到变换关系,生成新的图像矩阵.https://docs.opencv.org/master/d2/de8/group__core__array.html

参考:https://docs.opencv.org/master/d3/dc1/tutorial_basic_linear_transform.html

总结

以上所述是小编给大家介绍的opencv调整图像亮度对比度的示例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
详解Python的Django框架中的通用视图
May 04 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
python 自定义装饰器实例详解
Jul 20 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
Apr 23 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
django 认证类配置实现
Nov 11 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 #Python
pytorch多GPU并行运算的实现
Sep 27 #Python
Python使用matplotlib 模块scatter方法画散点图示例
Sep 27 #Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 #Python
Python绘制热力图示例
Sep 27 #Python
python将print输出的信息保留到日志文件中
Sep 27 #Python
python线程安全及多进程多线程实现方法详解
Sep 27 #Python
You might like
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python psutil模块使用方法解析
2019/08/01 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python如何存储数据到json文件
2020/03/09 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
python3跳出一个循环的实例操作
2020/08/18 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
人力资源管理专业学生自我评价
2013/11/20 职场文书
开业庆典主持词
2014/03/21 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
技术员岗位职责范本
2015/04/11 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
话题作文之成长
2019/12/09 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python