本文目录一览:
如何python pil开发图像识别
1. 简介。
图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前版本为 1.1.7,我们可以 在这里 下载学习和查找资料。
Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。
2. 使用。
导入 Image 模块。然后通过 Image 类中的 open 方法即可载入一个图像文件。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象。现在,我们可以通过一些对象属性来检查文件内容,即:
1 import Image
2 im = Image.open("j.jpg")
3 print im.format, im.size, im.mode
4 JPEG (440, 330) RGB
这里有三个属性,我们逐一了解。
format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。
size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。
mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。
现在,我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:
1 im.show()
2
输出原图:
3. 函数概貌。
3.1 Reading and Writing Images : open( infilename ) , save( outfilename )
3.2 Cutting and Pasting and Merging Images :
crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。
paste() :
merge() :
1 box = (100, 100, 200, 200)
2 region = im.crop(box)
3 region.show()
4 region = region.transpose(Image.ROTATE_180)
5 region.show()
6 im.paste(region, box)
7 im.show()
其效果图为:
旋转一幅图片:
1 def roll(image, delta):
2 "Roll an image sideways"
3
4 xsize, ysize = image.size
5
6 delta = delta % xsize
7 if delta == 0: return image
8
9 part1 = image.crop((0, 0, delta, ysize))
10 part2 = image.crop((delta, 0, xsize, ysize))
11 image.paste(part2, (0, 0, xsize-delta, ysize))
12 image.paste(part1, (xsize-delta, 0, xsize, ysize))
13
14 return image
3.3 几何变换。
3.3.1 简单的几何变换。
1 out = im.resize((128, 128)) #
2 out = im.rotate(45) #逆时针旋转 45 度角。
3 out = im.transpose(Image.FLIP_LEFT_RIGHT) #左右对换。
4 out = im.transpose(Image.FLIP_TOP_BOTTOM) #上下对换。
5 out = im.transpose(Image.ROTATE_90) #旋转 90 度角。
6 out = im.transpose(Image.ROTATE_180) #旋转 180 度角。
7 out = im.transpose(Image.ROTATE_270) #旋转 270 度角。
各个调整之后的图像为:
图片1:
图片2:
图片3:
图片4:
3.3.2 色彩空间变换。
convert() : 该函数可以用来将图像转换为不同色彩模式。
3.3.3 图像增强。
Filters : 在 ImageFilter 模块中可以使用 filter 函数来使用模块中一系列预定义的增强滤镜。
1 import ImageFilter
2 imfilter = im.filter(ImageFilter.DETAIL)
3 imfilter.show()
3.4 序列图像。
即我们常见到的动态图,最常见的后缀为 .gif ,另外还有 FLI / FLC 。PIL 库对这种动画格式图也提供了一些基本的支持。当我们打开这类图像文件时,PIL 自动载入图像的第一帧。我们可以使用 seek 和 tell 方法在各帧之间移动。
1 import Image
2 im.seek(1) # skip to the second frame
3
4 try:
5 while 1:
6 im.seek( im.tell() + 1)
7 # do something to im
8 except EOFError:
9 pass
3.5 更多关于图像文件的读取。
最基本的方式:im = Image.open("filename")
类文件读取:fp = open("filename", "rb"); im = Image.open(fp)
字符串数据读取:import StringIO; im = Image.open(StringIO.StringIO(buffer))
从归档文件读取:import TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)
基本的 PIL 目前就练习到这里。其他函数的功能可点击 这里 进一步阅读。
怎样使用Python图像处理
Python图像处理是一种简单易学,功能强大的解释型编程语言,它有简洁明了的语法,高效率的高层数据结构,能够简单而有效地实现面向对象编程,下文进行对Python图像处理进行说明。
当然,首先要感谢“恋花蝶”,是他的文章“用Python图像处理 ” 帮我坚定了用Python和PIL解决问题的想法,对于PIL的一些介绍和基本操作,可以看看这篇文章。我这里主要是介绍点我在使用过程中的经验。
PIL可以对图像的颜色进行转换,并支持诸如24位彩色、8位灰度图和二值图等模式,简单的转换可以通过Image.convert(mode)函数完 成,其中mode表示输出的颜色模式。例如''L''表示灰度,''1''表示二值图模式等。
但是利用convert函数将灰度图转换为二值图时,是采用固定的阈 值127来实现的,即灰度高于127的像素值为1,而灰度低于127的像素值为0。为了能够通过自定义的阈值实现灰度图到二值图的转换,就要用到 Image.point函数。
深度剖析Python语法功能
深度说明Python应用程序特点
对Python数据库进行学习研究
Python开发人员对Python经验之谈
对Python动态类型语言解析
Image.point函数有多种形式,这里只讨论Image.point(table, mode),利用该函数可以通过查表的方式实现像素颜色的模式转换。其中table为颜色转换过程中的映射表,每个颜色通道应当有256个元素,而 mode表示所输出的颜色模式,同样的,''L''表示灰度,''1''表示二值图模式。
可见,转换过程的关键在于设计映射表,如果只是需要一个简单的箝位值,可以将table中高于或低于箝位值的元素分别设为1与0。当然,由于这里的table并没有什么特殊要求,所以可以通过对元素的特殊设定实现(0, 255)范围内,任意需要的一对一映射关系。
示例代码如下:
import Image # load a color image im = Image.open(''fun.jpg'') # convert to grey level image Lim = im.convert(''L'') Lim.save(''fun_Level.jpg'') # setup a converting table with constant threshold threshold = 80 table = [] for i in range(256): if i threshold: table.append(0) else: table.append(1) # convert to binary image by the table bim = Lim.point(table, ''1'') bim.save(''fun_binary.jpg'')
IT部分通常要完成的任务相当繁重但支撑这些工作的资源却很少,这已经成为公开的秘密。任何承诺提高编码效率、降低软件总成本的IT解决方案都应该进行 周到的考虑。Python图像处理所具有的一个显著优势就是可以在企业的软件创建和维护阶段节约大量资金,而这两个阶段的软件成本占到了软件整个生命周期中总成本 的50%到95%。
Python清晰可读的语法使得软件代码具有异乎寻常的易读性,甚至对那些不是最初接触和开发原始项目的程序员都 能具有这样的强烈感觉。虽然某些程序员反对在Python代码中大量使用空格。
不过,几乎人人都承认Python图像处理的可读性远胜于C或者Java,后两 者都采用了专门的字符标记代码块结构、循环、函数以及其他编程结构的开始和结束。提倡Python的人还宣称,采用这些字符可能会产生显著的编程风格差 异,使得那些负责维护代码的人遭遇代码可读性方面的困难。转载
Python绘图之(1)Turtle库详解
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。
设置画布大小
turtle.screensize(canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(单位像素), 高, 背景颜色。
如:turtle.screensize(800,600, "green")
turtle.screensize() #返回默认大小(400, 300)
turtle.setup(width=0.5, height=0.75, startx=None, starty=None),参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。
如:turtle.setup(width=0.6,height=0.6)
turtle.setup(width=800,height=800, startx=100, starty=100)
2.1 画笔的状态
在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。
2.2 画笔的属性
画笔(画笔的属性,颜色、画线的宽度等)
1) turtle.pensize():设置画笔的宽度;
2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。
3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
2.3 绘图命令
操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。
(1) 画笔运动命令
(2) 画笔控制命令
(3) 全局控制命令
(4) 其他命令
3. 命令详解
3.1 turtle.circle(radius, extent=None, steps=None)
描述:以给定半径画圆
参数:
radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;
extent(弧度) (optional);
steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。
举例:
circle(50) # 整圆;
circle(50,steps=3) # 三角形;
circle(120, 180) # 半圆
实例:
1、太阳花
2、五角星
3、时钟程序
python可以制作时钟吗?
调试调试,参考参考
import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt
from PyQt4.QtCore import QPoint
from PyQt4.QtCore import QTimer
from PyQt4.QtCore import QTime
from PyQt4.QtGui import QPainter
from PyQt4.QtGui import QColor
from PyQt4.QtGui import QPolygon
from PyQt4.QtCore import SIGNAL as signal
class Clock(QtGui.QWidget):
'''
classdocs
'''
def __init__(self):
'''
Constructor
'''
super(Clock, self).__init__()
self.hourColor=QColor(127, 0, 127);
self.minuteColor=QColor(0, 127, 127, 191)
self.secondColor=QColor(127, 127,0,120)
self.initUI()
self.timer = QTimer()
self.timer.timeout.connect(self.update)
self.timer.start(30)
self.show()
def handChange(self):
self.side = min(self.width(), self.height())
self.hand=(max(self.side/200,4), max(self.side/100,8), max(self.side/40,30))
self.hourHand=QPolygon([QPoint(self.hand[0],self.hand[1]),QPoint(-self.hand[0],self.hand[1]),QPoint(0,-self.hand[2])])
self.minuteHand=QPolygon([QPoint(self.hand[0],self.hand[1]),QPoint(-self.hand[0],self.hand[1]),QPoint(0,-self.hand[2]*2)])
self.secondHand=QPolygon([QPoint(self.hand[0],self.hand[1]),QPoint(-self.hand[0],self.hand[1]),QPoint(0,-self.hand[2]*3)])
def set_transparency(self, enabled):
if enabled:
self.setAutoFillBackground(False)
else:
self.setAttribute(Qt.WA_NoSystemBackground, False)
#下面这种方式好像不行
# pal=QtGui.QPalette()
# pal.setColor(QtGui.QPalette.Background, QColor(127, 127,10,120))
# self.setPalette(pal)
self.setAttribute(Qt.WA_TranslucentBackground, enabled)
self.repaint()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Clock')
self.handChange()
self.rightButton=False
# 下面两个配合实现窗体透明和置顶
sizeGrip=QtGui.QSizeGrip(self)
self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow )
#self.setMouseTracking(True);
self.trans=True
self.set_transparency(True)
quitAction = QtGui.QAction(QtGui.QIcon('quit.png'), 'Quit', self)
self.connect(quitAction,signal("triggered()"),QtGui.qApp.quit)
backAction = QtGui.QAction( 'Back', self)
self.connect(backAction,signal("triggered()"),self.backClicked)
self.popMenu= QtGui.QMenu()
self.popMenu.addAction(quitAction)
self.popMenu.addAction(backAction)
def resizeEvent(self, e):
self.handChange()
def backClicked(self):
if self.trans == True :
self.trans = False
self.set_transparency(False)
else:
self.trans = True
self.set_transparency(True)
def mouseReleaseEvent(self,e):
if self.rightButton == True:
self.rightButton=False
self.popMenu.popup(e.globalPos())
def mouseMoveEvent(self, e):
if e.buttons() Qt.LeftButton:
self.move(e.globalPos()-self.dragPos)
e.accept()
def mousePressEvent(self, e):
if e.button() == Qt.LeftButton:
self.dragPos=e.globalPos()-self.frameGeometry().topLeft()
e.accept()
if e.button() == Qt.RightButton and self.rightButton == False:
self.rightButton=True
def paintEvent(self, e):
time = QTime.currentTime()
qp = QPainter()
qp.begin(self)
qp.setRenderHint(QPainter.Antialiasing) # 开启这个抗锯齿,会很占cpu的!
qp.translate(self.width() / 2, self.height() / 2)
qp.scale(self.side / 200.0, self.side / 200.0)
qp.setPen(QtCore.Qt.NoPen)
qp.setBrush(self.hourColor)
qp.save()
qp.rotate(30.0 * ((time.hour() + time.minute()/ 60.0)))
qp.drawConvexPolygon(self.hourHand)
qp.restore()
qp.setPen(self.hourColor)
for i in range(12):
qp.drawLine(88, 0, 96, 0)
qp.rotate(30.0)
qp.setPen(QtCore.Qt.NoPen)
qp.setBrush(self.minuteColor)
qp.save()
qp.rotate(6.0 * ((time.minute() + (time.second()+time.msec()/1000.0) / 60.0)))
qp.drawConvexPolygon(self.minuteHand)
qp.restore()
qp.setPen(self.minuteColor)
for i in range(60):
if (i % 5) is not 0:
qp.drawLine(92, 0, 96, 0)
qp.rotate(6.0)
qp.setPen(QtCore.Qt.NoPen)
qp.setBrush(self.secondColor)
qp.save()
qp.rotate(6.0*(time.second()+time.msec()/1000.0))
qp.drawConvexPolygon(self.secondHand)
qp.restore()
qp.end()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
clock = Clock()
sys.exit(app.exec_())
Python如何图像识别?
pillow包可以处理图像
pillow:(了解)(python image library)是一个有关图像图片处理的包,这个包底层用的C C++,但PIL包是python2下使用。所以又更新了一个适合python3版本的、基于PIL包的新包pillow。
安装pillow:
pip install pillow
至于识别,那就可能是文字识别或人脸识别。这需要学习很多东西,建议小白还是先把基础学好吧。