热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python简单图像处理(9)灰度变换

对这个工具,你一定很熟悉吧,Photoshop里有,很多简单的图像处理软件里面也会有那这个工具到底是什么意思呢,它和我们要讲到的灰度变换有很大的关系 在图像处理中,像图像度变换和直

对这个工具,你一定很熟悉吧,Photoshop里有,很多简单的图像处理软件里面也会有

那这个工具到底是什么意思呢,它和我们要讲到的灰度变换有很大的关系

 

在图像处理中,像图像度变换和直方图均衡都属于点运算范畴。

处理时作用域是单个像素

有表达式:

  g(x,y) = T[ f(x,y) ]    T为映射关系

在点运算中,映射关系是关键,它描述了输入灰度级和输出灰度级之间的关系。

灰度变换是图像增强的一种重要手段,用于改善图像的显示效果,属于空域处理方法

最开始我们讲的反转就属于灰度变换的一种

其变换关系为

  g(x,y)  = 255 - f(x,y)

我们来讲讲常用的灰度变换

(1)灰度线性变换

1.图像反转


2.线性灰度变换

表达式关系为

3.分段线性灰度变换

表达式关系为

 

我们来写程序来实现这些功能:


import cv
def Hist(image,color = cv.RGB(102,204,204)):
a
= [0]*256
w
= image.width
h
= image.height
iHist
= cv.CreateImage((256,256),8,3)
for i in range(h):
for j in range(w):
iGray
= int(image[i,j])
a[iGray]
= a[iGray] + 1
S
= max(a)
for k in range(256):
a[k]
= a[k]*255/S
x
= (k,255)
y
= (k,255-a[k])
cv.Line(iHist,x,y,color)
return iHist

def GrayTr(image,array):
w
= image.width
h
= image.height
size
= (w,h)
iGrayTr
= cv.CreateImage(size,image.depth,1)
for i in range(h):
for j in range(w):
idex
= int(image[i,j])
iGrayTr[i,j]
= array[idex]
return iGrayTr

def Invert():
aInvert
= [0]*256
for i in range(256):
aInvert[i]
= 255 - i
return aInvert

def Linear():
aLinear
= [0]*256
for i in range(256):
if i<60:
aLinear[i]
= 30
elif i<200:
aLinear[i]
= int((220.0-30.0)/(200-60)*(i-60)+30)
else:
aLinear[i]
= 220
return aLinear

def SubLinear():
aSubLinear
= [0]*256
for i in range(256):
if i<60:
aSubLinear[i]
= int(30.0/60*i)
elif i<200:
aSubLinear[i]
= int((220.0-30.0)/(200-60)*(i-60)+30)
else:
aSubLinear[i]
= int((255.0-220.0)/(255-200)*(i-200)+220)
return aSubLinear

image = cv.LoadImage('lena.jpg',0)
iInvert
= GrayTr(image,Invert())
iLinear
= GrayTr(image,Linear())
iSubLinear
= GrayTr(image,SubLinear())
cv.ShowImage(
'image',image)
cv.ShowImage(
'iInvert',iInvert)
cv.ShowImage(
'iLinear',iLinear)
cv.ShowImage(
'iSubLinear',iSubLinear)
cv.ShowImage(
'iHist',Hist(image))
cv.ShowImage(
'iIHist',Hist(iInvert))
cv.ShowImage(
'iLHist',Hist(iLinear))
cv.ShowImage(
'iSubHist',Hist(iSubLinear))
cv.WaitKey(0)

 

运行效果如下:


 

我们看到第三幅图的直方图和其他的有很大差别

主要是在我们把原图中灰度值在60以下的点全部映射到灰度值30

使得灰度值为30的点特别多,导致其它的灰度值的点显得很少,相应的画出来也就特别短

但明显的,我们看到没有点映射到30一下和220以上,在灰度值上产生了截断效果

 

另外我们来看看灰度窗和灰度级分层:


灰度窗是左边映射关系:增强特定灰度值的对比度,其它的全部置0

灰度级分层:把在特定灰度级和其他灰度级的区域分开

编写程序:


import cv
def GrayTr(image,array):
w
= image.width
h
= image.height
size
= (w,h)
iGrayTr
= cv.CreateImage(size,image.depth,1)
for i in range(h):
for j in range(w):
idex
= int(image[i,j])
iGrayTr[i,j]
= array[idex]
return iGrayTr

def Window():
aWindow
= [0]*256
for i in range(60,121):
aWindow[i]
= int(255.0/(120-60)*(i-60))
return aWindow

def Slice():
aSlice
= [0]*256
for i in range(256):
if i>59 and i<121:
aSlice[i]
= 200
else:
aSlice[i]
= 30
return aSlice
image
= cv.LoadImage('lena.jpg',0)
iWindow
= GrayTr(image,Window())
iSlice
= GrayTr(image,Slice())
cv.ShowImage(
'image',image)
cv.ShowImage(
'iWindow',iWindow)
cv.ShowImage(
'iSlice',iSlice)
cv.WaitKey(0)

效果如下:

 

(2)灰度非线性变换


左边为对数变换,右边为指数变换(当然,上面的图不是很标准)

重点是生成对应的映射对

程序如下:


import cv
import math

def GrayTr(image,array):
w
= image.width
h
= image.height
size
= (w,h)
iGrayTr
= cv.CreateImage(size,image.depth,1)
for i in range(h):
for j in range(w):
idex
= int(image[i,j])
iGrayTr[i,j]
= array[idex]
return iGrayTr

def Log():
aLog
= [0]*256
for i in range(1,256):
aLog[i]
= int(32*math.log(i,2))
return aLog

def Exp():
aExp
= [0]*256
NUM
= 1.01
k
= math.pow(NUM,255)
for i in range(1,256):
aExp[i]
= int(255*math.pow(NUM,i)/k)
return aExp

image = cv.LoadImage('lena.jpg',0)
iLog
= GrayTr(image,Log())
iExp
= GrayTr(image,Exp())
cv.ShowImage(
'image',image)
cv.ShowImage(
'iLog',iLog)
cv.ShowImage(
'iExp',iExp)
cv.WaitKey(0)

效果如下

 

好啦。灰度变换就讲到这里啦!!

转载于:https://www.cnblogs.com/xianglan/archive/2010/12/28/1918852.html



推荐阅读
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
author-avatar
手机用户2602904453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有