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进行基础的函数式编程的教程
Mar 31 Python
浅谈Python中函数的参数传递
Jun 21 Python
Python操作Access数据库基本步骤分析
Sep 19 Python
详细分析python3的reduce函数
Dec 05 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
Django模型修改及数据迁移实现解析
Aug 01 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
详解python如何引用包package
Jun 07 Python
Python爬取豆瓣数据实现过程解析
Oct 27 Python
Pytorch可视化的几种实现方法
Jun 10 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的cms
2010/12/19 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
Java与JavaScript中判断两字符串是否相等的区别
2017/03/13 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python使用PyFetion来发送短信的例子
2014/04/22 Python
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
详解Django缓存处理中Vary头部的使用
2015/07/24 Python
Python生成数字图片代码分享
2017/10/31 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
一篇.NET面试题
2014/09/29 面试题
自荐信模版
2013/10/24 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
公司总经理任命书
2014/06/05 职场文书
房地产端午节活动方案
2014/08/24 职场文书
先进工作者申报材料
2014/12/23 职场文书
员工离职感谢信
2015/01/22 职场文书
2015小学师德工作总结
2015/07/21 职场文书
Redis特殊数据类型bitmap位图
2022/06/01 Redis