使用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. MySQL之单表查询
  2. oracle中生成大批量数据的方法-下
  3. 肺部ct重建_肺部CT血管分割及三维重建
  4. 如何建立你自己的Docker镜像
  5. .NET实现之(WebService数据提供程序)
  6. 腾讯的迷你门户首页新闻用到的Silverlight技术引用
  7. echarts 4.0.4怎么下载_怎么让ECharts的提示框tooltip自动轮播?
  8. windows下jenkins常见问题填坑
  9. linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?
  10. JQuery实现ajax跨域
  11. 《Java编程思想》笔记14.类型信息
  12. Wondershare DVD Creator mac版如何刻录光盘文件
  13. [转载][不转不行了^皿^]金庸小说中的十大“公司”
  14. 好程序员分享面向对象概念的理解以及ES3和ES6中类的写法
  15. STM32F446高性能MCU芯片介绍
  16. Redis——好友关注、共同关注、Feed流推送
  17. 毕业生招聘信息的发布与管理系统(论文+设计)
  18. 《伪样本新场景样本挖掘和适应》
  19. python俄罗斯方块编程思路_少儿编程分享:手把手教你用Python编写俄罗斯方块(十)...
  20. visibility 和 display 的区别

热门文章

  1. Fragment之间传递数据的方式
  2. Django 分页和使用Ajax5.3
  3. VIM配置攻略(最强干货加强版)
  4. android Service 的使用
  5. swoole安装异步reids
  6. 管理员技术(六): 硬盘分区及格式化、 新建一个逻辑卷、调整现有磁盘的分区、扩展逻辑卷的大小、添加一个swap分区...
  7. 2022-2028年中国B2C电子商务市场投资分析及前景预测报告
  8. 2022-2028年中国无人经济行业深度调研及投资前景预测报告
  9. [置顶] 我的GB28181标准开发里程碑——基于eXosip的IPC端与SPVMN注册成功
  10. 全浏览器兼容的DIV拖动效果