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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
寻找网站后台地址的python脚本
Sep 01 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
Nov 14 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
使用Python解决图表与画布的间距问题
Apr 11 Python
Python实现对齐打印 format函数的用法
Apr 28 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
多文件上传的例子
2006/10/09 PHP
使用PHP和XSL stylesheets转换XML文档
2006/10/09 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
2010/04/28 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
2017/08/09 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
JS验证码实现代码
2017/09/14 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
jquery实现购物车基本功能
2019/10/25 jQuery
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
python 除法保留两位小数点的方法
2018/07/16 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
python 基于opencv操作摄像头
2020/12/24 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
党员自我评价分享
2013/12/13 职场文书
小学敬老月活动方案
2014/02/11 职场文书
《王二小》教学反思
2014/02/27 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
工作报告范文
2019/06/20 职场文书