英文原文:

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

中文翻译:

  • https://www.jb51.net/article/171029.htm

文章目录

  • 1 图像处理
  • 2 获取图片的亮度
  • 3 对比度和亮度改变
    • 3.1 线性变换
    • 3.2 非线性变换—Gamma 校正

1 图像处理

图像变换就是找到一个函数,把原始图像矩阵经过函数处理后,转换为目标图像矩阵。
 
可以分为两种方式,即像素级别的变换和区域级别的变换

  • Point operators (pixel transforms)

  • Neighborhood (area-based) operators

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

2 获取图片的亮度

import cv2img = cv2.imread("2_1332.jpg")# 法一:利用 mean
x = img.mean()# 法二:三层循环
total = 0
h, w, c = img.shape
for i in range(h):for j in range(w):for k in range(c):total += img[i][j][k] # 统计像素值总和print(total/img.size) # 获取每个空间位置上的平均像素值
print(x)

output

133.61220920138888
133.61220920138888

3 对比度和亮度改变

Python中计算图像亮度

3.1 线性变换

最常用的是线性变换,即

g(i,j)=α⋅f(i,j)+βg(i,j) = \alpha \cdot f(i,j) + \betag(i,j)=α⋅f(i,j)+β

α\alphaα 调整对比度, β\betaβ 调整亮度。有时也称之为 gain 和 bias 参数。

对比度是什么?不就是 “亮和暗的区别” 吗?也就是像素值的大小的区别。那我乘以一个 α\alphaα 系数,当 α\alphaα 很大的时候就是放大了这种亮度值的差异,也就是提高了对比度(1 和 2 的差距是 1,×1.2 倍后,1.2 和 2.4 的差距是 1.2);当 α\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

上图是 α=2\alpha=2α=2, β=20\beta=20β=20 的一个效果图。

线性变换有个问题,如上图,α=1.3\alpha=1.3α=1.3 and β=40\beta=40β=40,提高原图亮度的同时,导致云几乎看不见了。如果要看见云的话,建筑的亮度又不够,这个时候就引入了非线性变换。

3.2 非线性变换—Gamma 校正

理论可以参考 图像的Gamma变换,公式表示如下

O=(I255)γ×255O = \left( \frac{I}{255} \right)^{\gamma} \times 255O=(255I​)γ×255

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

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


上图横坐标是输入的像素值,纵坐标是输出的像素值,线性变换相当于改变了斜率和截距,会导致原图部分像素值被截断

下面看一个例子

如果查看不同变换下的灰度直方图的话可以看到

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

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

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

【python】OpenCV—Brightness and Contrast adjustments相关推荐

  1. 【python】OpenCV—Blur, Threshold, Gradient, Morphology(2)

    系列文章 [python]OpenCV-RGB, Rectangle, Circle, SS(1) [python]OpenCV-Blur, Threshold, Gradient, Morpholo ...

  2. 【python】OpenCV—Video to Imag / Image to Video

    文章目录 0 一些知识 1 计算总帧数 2 计算 Frames per second(FPS) 3 Video to Image 4 Image to Video 0 一些知识 视频的基础参数:分辨率 ...

  3. 【Python】OpenCV中的cv2.inpaint()函数

    概念 修复是图像插值.数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用. 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等.你有没有想过恢复它?我们不能简单地在绘画工 ...

  4. 【python】opencv教程CV2模块——图片处理,HSV、色调、亮度调节

    opencv教程CV2模块--图片处理,HSV.色调.亮度调节 代码传送门: import cv2img=cv2.imread('./imgg/1.jpeg', cv2.IMREAD_COLOR) # ...

  5. 【python】opencv双边滤波

    对于磨皮这种复杂的图像处理,用scipy这种科学计算包显然会比较复杂,故而使用神器opencv pip install opencv-python 磨皮的本质就是将表面变得模糊,然而直接使用模糊会让轮 ...

  6. 【Python】opencv展示汉字及与pillow对比

    1.前记 因为opencv不能显示中文(会变成???),所以尝试通过opencv->pillow->opencv这种方式来实现,具体可参考这篇博客. 2.利用pillow展示中文 下面来简 ...

  7. 【python】opencv教程CV2模块——视频捕获,延时摄影视频、鬼畜表情包密集制作

    opencv教程CV2模块还可以调用摄像头录制视频呢,没想到吧! 制作延时摄影视频或者鬼畜表情包gif也是轻而易举的事情,等你发挥啦! 代码传送门: import cv2 import timeint ...

  8. 【Python】基于人脸识别的智能考勤系统(Pyqt5+MySQL+Opencv) [PC端部分-已附源码]

    [Python]基于人脸识别的考勤系统 [PC端部分] 一.项目简介 本项目编程语言Python3.6,编程工具pycharm,其他工具QT Designer.Navicat,表单信息保存在本地MyS ...

  9. 【python】15行代码实现猫脸检测(opencv)

    文章目录 1. 项目简介 2. 项目地址 3. 依赖模块 4. 完整代码 5. 必要组件 5.1. haar级联特征分类器(精度高) 5.2. lbp级联特征分类器(速度快) 6. 成果展示 6.1. ...

最新文章

  1. 另辟蹊径创建移动应用:iOS和Android代码共享
  2. 是的,网络身份证来了!一堆技术和安全上的麻烦事也来了
  3. AI检测贫血不看血,竟是看眼睛
  4. VMware虚拟机上的文件如何和Windows进行共享
  5. 水稻微生物组时间序列分析4-随机森林回归
  6. 大数据入门之Hadoop基础学习
  7. Oracle管理拾遗(长期更新)
  8. Laravel5.1 搭建博客 --文章的增删改查
  9. 统计每日单量MySQL语句
  10. NYOJ 655 光棍的yy
  11. 首发 | 中间件小姐姐直播“带货”——阿里程序员必知的插件
  12. 使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决
  13. VB 二进制数组与十六进制字符串相互转换
  14. 怎么在堆叠柱状图中体现百分比_微生物门类堆叠柱状图一文解决
  15. 用Java实现多线程下载
  16. 稳健Capon波束形成
  17. vyos in or out 限流量
  18. 一个英文字母,一个中文各占多少字节
  19. 崩坏3服务器维护2月8号,崩坏38月2日版本更新维护通知_游戏堡
  20. 阿里云RDS数据库备份恢复【取证】教程

热门文章

  1. 不懂不要炒股,一定要在调整时买入股票!
  2. 微信公众号接入智能客服机器人可以实现哪些效果
  3. 旷视科技面试——算法岗
  4. 禁用ubuntu来宾账户
  5. iOS开发:xcode无法选择设备和corner stone如何过滤上传文件
  6. vb安装过程中 ntvdm.exe[9696]中发生未处理的win32异常
  7. 敏捷迭代开发——Time-Boxing时间盒
  8. linux程序设计项目报告,Linux程序设计实验报告大作业
  9. 《2018中国区块链行业发展白皮书》发布
  10. python兔子_python 实现兔子生兔子示例