热门标签 | 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对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
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社区 版权所有