Python灰度变换中伽马变换分析实现

目录
  • 1. 介绍
  • 2. 代码实现
  • 3. 提升视频的亮度

1. 介绍

伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正

伽马变换针对的是对单个像素点的变换,也就是点对点的映射

形式为:

其中,s为输出的像素点的灰度值,r为输入像素点的灰度值。c 、 γ 为常数

γ 值不同的时候,对应的变换曲线如图,这里我们不关注具体函数的取值,而只是关注变换曲线的形状

通过观察可以发现

  • γ > 1 的时候,会压缩暗区的对比度,抬高亮区的对比度。并且γ越大,效果越明显
  • γ < 1 的时候,会提升暗区的对比度,压缩亮区的对比度。并且γ越小,效果越明显
  • γ = 1 的时候,图像的灰度不变(c 也为1)

2. 代码实现

import cv2
import numpy as np
def grammar(x, r):
    y = pow(x / 255 , r) * 255
    return y.astype(np.uint8)
img  = cv2.imread('./f.jpg',0)
img_grammar = grammar(img,0.6)
cv2.imshow('img',np.hstack((img,img_grammar)))
cv2.waitKey()
cv2.destroyAllWindows()

原图和 γ = 0.6 的效果

这里需要进行归一化处理,因为整数的小数次方可能会丢失精度,我们将灰度值变为(0,1)之间,转换成小数与小数的次方会更加准确。

3. 提升视频的亮度

import numpy as np
import cv2
def grammar(x , r):   #  grammar 变换
    y = pow(x / 255 , r) * 255
    return y.astype(np.uint8)
video = cv2.VideoCapture('./hand.mp4')   # 读取视频
while video.isOpened():        # 如果视频/摄像头 读取成功
    ret,frame = video.read()    # 读取每一帧
    img = grammar(frame,0.6)    # 将每一帧进行进行grammar变换
    if ret == True :           # 读取到frame的话
        cv2.imshow('img',np.hstack((frame,img)))
    key=cv2.waitKey(1)
    if key == ord('q'):        # q 退出
        break
    if key == 32:              # 空格键 暂停
        cv2.waitKey(0)
        continue
video.release()
cv2.destroyAllWindows()

视频效果:

到此这篇关于Python灰度变换中伽马变换分析实现的文章就介绍到这了,更多相关Python伽马变换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python灰度变换中的对数变换专项分析实现

    目录 1. 原理 2. 代码 1. 原理 对数变换的公式为: 其中:c是伸缩系数,常设为1.src为输入的原图像,dst为经过对数变换的输出图像 对数变换的曲线为: 由曲线的形状可以发现,对数变换将输入中范围较窄的低灰度值映射为输出中灰度值较宽的部分.也就是对数变换可以提升原图中暗区的对比度,同时可以压缩明亮区的对比度. 反对数变换的效果刚好相反 2. 代码 import numpy as np import cv2 def log(x): y =np.log(1+x) ym = y- y.mi

  • Python图像灰度变换及图像数组操作

    使用python以及numpy通过直接操作图像数组完成一系列基本的图像处理 numpy简介: NumPy是一个非常有名的 Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量.矩阵.图像等)以及线性代数函数. 数组对象可以实现数组中重要的操作,比如矩阵乘积.转置.解方程系统.向量乘积和归一化.这为图像变形.对变化进行建模.图像分类.图像聚类等提供了基础. 在上一篇python基本图像操作中,当载入图像时,通过调用 array() 方法将图像转换成NumPy的数组对象

  • Python灰度变换中的分段线性函数专项分析实现

    目录 1. 分段线性函数介绍 2. 代码实现 3. other 1. 分段线性函数介绍 分段线性函数同样是点运算,基于像素的图像增强,也就是对比度拉伸. 大概的原理就是:将不同灰度区间的灰度值经过不同的映射函数映射到另一个灰度区间的过程. 因为使用变换函数的个数是三个,所以我们经常使用的分段线性函数是三段线性变换函数 对应的数学公式为 a = 1 ,b = 0 时,恒等函数,不改变图像的灰度值 a >1, 对比度增强 0 < a < 1 , 对比度减弱 b 控制图像的亮度,b >

  • Python灰度变换中位图切割分析实现

    目录 1. 介绍 2. 实现方法 3. code 4. 比特平面重建图像 1. 介绍 图像的像素值是由比特组成的.例如一副256级灰度图像中,图像是由8 bit组成. 与之前对比度拉伸的区别是,之前我们主要强调在某一范围的灰度值作为我们能感兴趣的目标将其变亮或者变暗.而位图切割主要强调每个bit对图像的贡献,通过方法将不同位的灰度值值取出来还原成图像. 如图所示,一副8 bit图像,我们可以将图像分割成8个,将每个图像对应的比特位取出构建成一副新的图像 2. 实现方法 例如图像某一点的像素值为1

  • Python灰度变换中伽马变换分析实现

    目录 1. 介绍 2. 代码实现 3. 提升视频的亮度 1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形式为: 其中,s为输出的像素点的灰度值,r为输入像素点的灰度值.c . γ 为常数 γ 值不同的时候,对应的变换曲线如图,这里我们不关注具体函数的取值,而只是关注变换曲线的形状 通过观察可以发现 γ > 1 的时候,会压缩暗区的对比度,抬高亮区的对比度.并且γ越大,效果越明显 γ < 1 的时候,会提升暗区的对

  • 浅谈Python Opencv中gamma变换的使用详解

    伽马变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正. 伽马变换的基本形式如下: 大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢). #分道计算每个通道的直方图 img0 = cv2.imread('12.jpg') hist_b = cv2.calcHist([img0],

  • python 函数中的内置函数及用法详解

    今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. print(abs(-18)) print(abs(0.15)) result: 18 0.15 2.all(iterable) 如果iterable的所有元素不为0.''.False或者iterable为空,all(iterable)返回True,否则返回False. print(all(['a','b',

  • Python实现的计算马氏距离算法示例

    本文实例讲述了Python实现的计算马氏距离算法.分享给大家供大家参考,具体如下: 我给写成函数调用了 python实现马氏距离源代码: # encoding: utf-8 from __future__ import division import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np def mashi_distance(x,y): print x print y #马氏距离要求样本数要大于维数,

  • Python数据类型中的元组Tuple

    目录 一.定义 二.合并.重复与删除 三.元组转换 四.元组中的方法 一.定义 元组可以理解为一个只读列表,用()来标识. 定义一个空元组变量 = () 但是如果元组中只有一个元素时,是元组还是其他数据类型呢?让我们来验证一下. tuple_1 = (1) print(type(tuple_1)) tuple_2 = ("hello") print(type(tuple_2)) 以上的数据类型并不是元组,要表达只有一个元素的元组定义为变量 = (元素1,),让我们来验证一下: tupl

  • python开发中range()函数用法实例分析

    本文实例讲述了python开发中range()函数用法.分享给大家供大家参考,具体如下: python中的range()函数的功能很强大,所以我觉得很有必要和大家分享一下 就好像其API中所描述的: If you do need to iterate over a sequence of numbers, the built-in function range() comes in handy. It generates arithmetic progressions 下面是我做的demo: #

  • 解析Python编程中的包结构

    假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能需要创建和维护一个不断增长的各种文件格式之间的转换的模块集合.并且可能要执行声音数据处理(如混合,添加回声,应用平衡功能),所以你写一个永无止境的流模块来执行这些操作:模块设计的包如下: sound/ Top-level package __init__.py Initialize the sound package formats/ Su

随机推荐