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判断、获取一张图片主色调的2个实例
Apr 10 Python
python模拟Django框架实例
May 17 Python
Python实现简易端口扫描器代码实例
Mar 15 Python
Python字符串和字典相关操作的实例详解
Sep 23 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
Python离线安装PIL 模块的方法
Jan 08 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
Python实现简单的猜单词
Jun 15 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的FTP学习(三)
2006/10/09 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
javascript判断office版本示例
2014/04/11 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
nodejs通过钉钉群机器人推送消息的实现代码
2019/05/05 NodeJs
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
Python中for循环控制语句用法实例
2015/06/02 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
django框架使用方法详解
2019/07/18 Python
python实现日志按天分割
2019/07/22 Python
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
消防先进事迹材料
2014/02/10 职场文书
电气工程自动化求职信
2014/03/14 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
客户付款通知书
2015/04/23 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
导游词之包公祠
2019/11/25 职场文书
正确使用MySQL update语句
2021/05/26 MySQL