热门标签 | 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



推荐阅读
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
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社区 版权所有