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

目录
  • 1. 分段线性函数介绍
  • 2. 代码实现
  • 3. other

1. 分段线性函数介绍

分段线性函数同样是点运算,基于像素的图像增强,也就是对比度拉伸。

大概的原理就是:将不同灰度区间的灰度值经过不同的映射函数映射到另一个灰度区间的过程。

因为使用变换函数的个数是三个,所以我们经常使用的分段线性函数是三段线性变换函数

对应的数学公式为

  • a = 1 ,b = 0 时,恒等函数,不改变图像的灰度值
  • a >1, 对比度增强
  • 0 < a < 1 , 对比度减弱
  • b 控制图像的亮度,b > 0 图像变亮,b < 0 图像变弱

对比度:定义为图像中最高和最低灰度级之间的灰度差

但没有真正意义上的计算公式,只是大概意思的表示

如果一副图像灰度的动态范围具有高的动态范围,那我们就认为这幅图像的对比度高

2. 代码实现

import numpy as np
import cv2
def linear_transform(img):
    height,width = img.shape[:2]
    r1,s1 = 80,10
    r2,s2 = 140,200
    k1 = s1 / r1   # 第一段斜率
    k2 = (s2 - s1) / (r2 - r1) # 第二段斜率
    k3 = (255 - s2) / (255 - r2)  # 第三段斜率
    img_copy = np.zeros_like(img)
    for i in range(height):
        for j in range(width):
            if img[i,j] < r1 :
                img_copy[i,j] = k1 * img[i,j]
            elif r1 <= img[i,j] <= r2:
                img_copy[i,j] = k2 * (img[i,j] - r1) + s1
            else:
                img_copy[i,j] = k3 * (img[i,j] - r2) + s2
    return img_copy
img = cv2.imread('./img.png',0)
ret = linear_transform(img)
cv2.imshow('img',np.hstack((img,ret)))
cv2.waitKey()
cv2.destroyAllWindows()

处理结果为

这里代码的实现较为简单,不再赘述,单纯的取图像的像素点然后进行映射而已。

3. other

说说中间两个分段点怎么取值的问题

因为通过观察原图发现,图像整体灰度值偏低,所以我们将原图(0-80)的灰度值压缩到(0-10)范围内,再将中间的(80-140) 灰度值放大,就可以将中间的对比度拉大

书上的分段点取得是(r1,s1) = (r.min , 0) , (r2,s2) = (r.max , 255)

只需要将上面的代码改成这样,就可以得到下面的图片

但是这种方法可能不是很泛化,因为观察这幅图片的直方图可以发现,原图片的低灰度值和高灰度值都是没有的。而往往大多数的图片动态范围都是(0,255)。如果按照书上的进行,就会变成

(r1,s1) = (0, 0) , (r2,s2) = (255 , 255),就变成y = x的恒等变换了

最后,因为观察直方图,可以知道,在80-90 左右 的左侧像素值均为背景信息,我们可以进行压缩对比度。而在 90-130 中间灰度占比多,为前景信息,我们可以进行对比度拉伸

上面的分段点就是观察直方图得出来得值

  • 所以分段线性函数的分段点可以通过直方图简单得到
  • 分段线性变换可以不是连续的

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

(0)

相关推荐

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

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

  • 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灰度变换中的分段线性函数专项分析实现

    目录 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编程中的反模式实例分析

    本文实例讲述了Python编程中的反模式.分享给大家供大家参考.具体分析如下: Python是时下最热门的编程语言之一了.简洁而富有表达力的语法,两三行代码往往就能解决十来行C代码才能解决的问题:丰富的标准库和第三方库,大大节约了开发时间,使它成为那些对性能没有严苛要求的开发任务的首选:强大而活跃的社区,齐全的文档,也使很多编程的初学者选择了它作为自己的第一门编程语言.甚至有国外的报道称,Python已经成为了美国顶尖大学里最受欢迎的编程入门教学语言. 要学好一门编程语言实属不易,在初学阶段,就

  • 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开发中module模块用法实例分析

    本文实例讲述了python开发中module模块用法.分享给大家供大家参考,具体如下: 在python中,我们可以把一些功能模块化,就有一点类似于java中,把一些功能相关或者相同的代码放到一起,这样我们需要用的时候,就可以直接调用了 这样做的好处: 1,只要写好了一个功能模块,就可以在以后调用,代码的重用就可以体现出来了 2,功能写好了以后,不会发生错误.如果一个相同的功能,我们在一个模块中写了一遍,在另外的模块中又写了一遍......这样我们难免保证我们在写的过程中不发生错误. 但是我们如果

  • Python中的默认参数实例分析

    本文研究的主要是Python中的默认参数的相关内容,具体如下. 熟悉C++语言的可以知道,C++语言中的默认参数是写在函数声明中的,为语法糖,与函数的调用无关,是在函数调用的时候由编译器补齐参数然后进行调用. 而Python中的默认参数与其有相当大的不一样,如下例中的代码执行结果会是什么呢? def test_parameter(a, dfp=[]): dfp.append(a) print(dfp) test_parameter(1) test_parameter(2) test_parame

  • python中in在list和dict中查找效率的对比分析

    首先给一个简单的例子,测测list和dict查找的时间: import time query_lst = [-60000,-6000,-600,-60,-6,0,6,60,600,6000,60000] lst = [] dic = {} for i in range(100000000): lst.append(i) dic[i] = 1 start = time.time() for v in query_lst: if v in lst: continue end1 = time.time

  • 对python中的xlsxwriter库简单分析

    一.xlsxwriter 基本用法,创建 xlsx 文件并添加数据 官方文档:http://xlsxwriter.readthedocs.org/ xlsxwriter 可以操作 xls 格式文件 注意:xlsxwriter 只能创建新文件,不可以修改原有文件.如果创建新文件时与原有文件同名,则会覆盖原有文件 Linux 下安装: sudo pip install XlsxWriter Windows 下安装: pip install XlsxWriter # coding=utf-8 from

随机推荐