使用Python和OpenCV实现超快速,简单的伽玛校正功能

  • 1. 效果图
  • 2. 什么是伽玛校正?
  • 3. 源码
  • 参考

这篇博客将介绍伽马校正(也称为幂律变换)是什么,并将演示如何使用Python和OpenCV实现超快速,简单的伽玛校正功能。

使用伽玛校正的原因是因为眼睛与数码相机中的传感器所感知的颜色和亮度不同。
当数码相机上的传感器接收到两倍数量的光子时,信号将加倍(线性关系)。但是当光子增加一倍时,眼睛感知到的光量只是原来的一小部分(非线性关系)。

伽玛校正可以看作是眼睛灵敏度和相机传感器之间的转换。

学习完可以尝试对自己的照片进行伽玛校正。查找过暗或过亮并被过量曝光的图像。然后对这些图像进行伽玛校正,看它们是否在视觉上更具吸引力。

1. 效果图

原图 VS 0.1伽玛值 如下:

原图 VS 0.5伽玛值 如下:

原图 VS 1.5伽玛值 如下:

  • 可以看到伽玛值0.1使得图像足够暗没法看;
  • 伽玛值为0.5会使结果图像显得比原始图像更暗;
  • 伽玛值1.5使得结果图像比原始图像更亮,基本会报废掉;

上图效果不是很明显,下边的右侧伽玛图像更具有吸引力,对比度更强,比原始图更好看

2. 什么是伽玛校正?

  • Gamma correction 伽玛校正
  • the Power Law Transform 幂律变换

伽玛校正也称为幂律变换。首先,图像像素强度必须在[0,255]到[0,1.0]的范围内缩放。然后可以通过应用以下方程式获得输出的伽玛校正图像:

O = I ^(1 / G)

其中I是输入图像,G是伽玛值。然后将输出图像O缩放回范围[0,255]。

伽玛值<1将使图像移向光谱的较暗端,而伽玛值> 1将使图像显得较亮。 Gamma值G = 1对输入图像没有影响。


有两种(简单)的方法可以使用OpenCV和Python进行伽玛校正:

  1. 简单地利用Python + OpenCV将图像表示为NumPy数组。只需将像素强度缩放到[0,1.0]范围,应用变换,然后再缩放回[0,255]范围。总体而言,NumPy方法涉及除法,加到幂,再乘以乘法-由于所有这些运算都是矢量化的,因此非常快。
  2. 借助OpenCV,可以更快地执行伽玛校正。需要建立一张表格(即字典),将输入像素值映射到输出经过伽玛校正的值。然后,OpenCV可以获取该表并快速确定O(1)时间中给定像素的输出值。

3. 源码

# Gamma correction and the Power Law Transform,伽马校正也称幂律交换;使图像变得更亮或者更暗的方法;
# USAGE
# python adjust_gamma.py --image images/_L3A4387.jpg# 导入必要的包
from __future__ import print_function
import numpy as np
import argparse
import cv2
import imutils# 伽马校正
# --image 要对其应用伽玛校正的图像。
# --gamma (可选)伽玛值,默认1.0
def adjust_gamma(image, gamma=1.0):# 建立查找表,将像素值[0,255]映射到调整后的伽玛值# 遍历[0,255]范围内的所有像素值来构建查找表,然后再提高到反伽马的幂-然后将该值存储在表格中invGamma = 1.0 / gammatable = np.array([((i / 255.0) ** invGamma) * 255for i in np.arange(0, 256)]).astype("uint8")# 使用查找表应用伽玛校正return cv2.LUT(image, table)# 构建命令行参数及解析
#  --image 图像路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to input image")
args = vars(ap.parse_args())# 加载原始图像
original = cv2.imread(args["image"])
original = imutils.resize(original, width=300)# 通过使用各种伽玛值并检查每个图像的输出图像来探索伽玛校正;
# 遍历各种不同的伽马值
for gamma in np.arange(0.0, 2, 0.5):# 忽略伽马值为1的情况,因为跟原始图像没有任何差别if gamma == 1:continue# 应用伽马校正并展示图像gamma = gamma if gamma > 0 else 0.1adjusted = adjust_gamma(original, gamma=gamma)cv2.putText(adjusted, "g={}".format(gamma), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)cv2.imshow("Images", np.hstack([original, adjusted]))name = str(args['image']).replace(".jpg", "_" + str(gamma) + ".jpg")cv2.imwrite(name, adjusted)cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2015/10/05/opencv-gamma-correction/

使用Python和OpenCV实现超快速,简单的伽玛校正功能相关推荐

  1. Python版本OpenCV安装配置及简单实例

    # 2018-06-03 # 1. Python下载:https://www.python.org/downloads/ 选择对应平台对应版本的的Python进行安装. 2. Python版OpenC ...

  2. python之opencv人脸识别快速体验

    目录 1.灰度转换 2.引用opencv官方提供的人脸训练模型 3.绘制方框(用于框住人脸) 4.效果及完整代码: 5.检测多张人脸: 学习链接: 1.灰度转换 # 灰度转换gary = cv.cvt ...

  3. Python,OpenCV图像处理超好用的工具包imutils

    imutils是我崇拜的大佬Adrian贡献的源码包,其中包含许多图像处理便捷的方法: 安装: pip install imutils 包含的工具类及方法列表: 图像平移方法 # 平移向右25px,向 ...

  4. ffmpeg php裁剪上传视频教程,经验秘籍:ffmpeg超快速简单的视频批量剪切裁剪工具教程...

    事情的起因是这样,给朋友下载了全集1080p的电影,拷贝到优盘后用电视看得挺好,过一阵说每次切换都有片头,还要手动往后倒,让我处理下,当时想的这种小事随便网上搜个什么批量工具就搞定了,结果弄了半天,不 ...

  5. Python+Tensorflow+Opencv人脸识别(任意数量人脸)

    Python+Tensorflow+Opencv的人脸识别 简单的人脸识别 准备工作 开始--先获取必要的人脸图像 训练--分类吧 识别大脸 简单的人脸识别 一直想做机器学习的东东,最近由于工作的调整 ...

  6. 用Python和OpenCV库实现识别人物出现并锁定

    我们将分为以下几个步骤完成这个项目: 目录 1. 安装必要的库 2. 加载和显示视频 3. 应用预训练的人物检测模型 4. 在检测到的人物周围绘制边界框 5. 保存和显示结果 总结: 1. 安装必要的 ...

  7. 使用Python和OpenCV在图像之间执行超快速的颜色转换

    使用Python和OpenCV在图像之间执行超快速的颜色转换 1. 效果图 2. 原理 2.1 颜色转移算法 2.2 步骤 2.3 算法改进 3. 源码 参考 这篇博客将介绍如何使用Python和Op ...

  8. 使用Python,OpenCV实现图像之间超快速的颜色转移

    图像之间超快速的颜色转移 1. 效果图 2. 步骤 3. 改进算法的方法 4. 源码 参考 目标:源图像与目标图像,转移源图像的色彩空间到目标图像,生成一张新的图像: 有关如何在两个图像之间转移颜色, ...

  9. 简单的python抢红包脚本-Python自动抢红包,超详细教程,再也不会错过微信红包了!...

    来源:python专栏 github:https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/Too ...

最新文章

  1. Bootstrap-下拉菜单
  2. 智能车竞赛技术报告 | 智能车视觉 - 中原工学院 - 逐鹿 - 分母队
  3. ubuntu16.04装机:网易云+搜狗拼音+chrome+uGet+caffe(openCV3.1+CUDA+cuDNN+python)
  4. python入门(七)
  5. BASIC-1_蓝桥杯_闰年判断
  6. 广西区计算机一级考试操作题,全国高校计算机等级考试(广西考区)一级笔试试题卷.doc...
  7. linux socket recv函数如何判断收完一包_linux 下经典 IO 复用模型 epoll 的使用
  8. linux-使用xshell连接linux教程
  9. 买基金你们都亏了多少钱?
  10. 牛客 2021年度训练联盟热身训练赛第二场 D题Soccer Standings
  11. 机器学习项目实战----泰坦尼克号获救预测(一)
  12. Spring boot常见标签、注解解释
  13. Rotate Array
  14. java 当前时间 long_java 获取当前的日期、时间, 日期、字符串、long之间的相互转换...
  15. 宝马无法gps定位_宝马5系GPS定位不准确怎么回事
  16. 用Qt自己开发的 数学坐标绘图软件 可用于 论文,报告插图
  17. 从零开始前端学习[26]:html5的一些常用标签,header,footer,section,aside,figure,figcaption,nav,artical,
  18. 李一男离开华为时给属下的忠告!
  19. java写triangle_Java - 制作Triangle类
  20. 让电脑无法使用QQ或微信

热门文章

  1. 自动驾驶关键技术分解和流程
  2. 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️
  3. Android startActivityForResult()的用法
  4. No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
  5. android 系统定位
  6. python第二十九课——文件读写(复制文件)
  7. Docker | Docker技术基础梳理(五) - Docker网络管理
  8. css选择器及float(浮动)
  9. 如何配置FastReport.Net环境
  10. Test on 11/10/2016