群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
1.PIL:Python影像库
PIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。
在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。
PIL文档可在这里找到:
在线PIL文档
PDF PIL文件
2.加载图像
这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。
导入HYP_Utils
导入系统
从PIL导入图像
scriptDir = HYP_Utils.GetDemoDir()
PIL_Version = Image.VERSION
img_filename =“%s / flower.jpg”%scriptDir
im = Image.open(img_filename)
im.show()
在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。
3.保存图像
只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。
阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。
这里是一个简单的JPG到BMP转换器:
导入HYP_Utils
从PIL导入图像
scriptDir = HYP_Utils.GetDemoDir()
PIL_Version = Image.VERSION
img_filename =“%s / flower.jpg”%scriptDir
im = Image.open(img_filename)
im.save(“%s / flower.bmp”%scriptDir)
4.读取像素
有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。
图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。
这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。
导入HYP_Utils
导入HYP_Texture
进口HYP_Material
导入系统
从PIL导入图像
scriptDir = HYP_Utils.GetDemoDir()
PIL_Version = Image.VERSION
img_filename =“%s / flower.jpg”%scriptDir
im = Image.open(img_filename)
imageW = im.size [0]
imageH = im.size [1]
TEXTURE_2D = 2
RGB_BYTE = 2
texId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)
matId = HYP_Material.GetId(“plane1_mat”)
HYP_Material.AddTexture(matId,texId)
如果(im.mode ==“RGB”):
对于范围内的y(0,imageH):
对于范围内的x(0,imageW):
xy =(x,y)
rgb = im.getpixel(xy)
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
elif(imout.mode ==“L”):
对于范围内的y(0,imageH):
对于范围内的x(0,imageW):
xy =(x,y)
rgb = im.getpixel(xy)
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
使用Image.getdata(),前面脚本的最后几行是:
pixels = list(im.getdata())
如果(im.mode ==“RGB”):
对于范围内的y(0,imageH):
对于范围内的x(0,imageW):
rgb =像素[偏移]
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
elif(imout.mode ==“L”):
对于范围内的y(0,imageH):
对于范围内的x(0,imageW):
rgb =像素[偏移]
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
5.图像处理
您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:
从PIL导入图像
从PIL导入ImageFilter
...
i = Image.open(img_filename)
im = i.filter(ImageFilter.EMBOSS)
#im = i.filter(ImageFilter.FIND_EDGES)
...
预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。
还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。
6.添加水印
ImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。
导入HYP_Utils
导入os,glob
从PIL导入图像
从PIL导入ImageDraw
从PIL导入ImageFont
scriptDir = HYP_Utils.GetDemoDir()
ft = ImageFont.load(“timR24.pil”)
os.chdir(SCRIPTDIR)
file_list = glob.glob(“*。jpg”)
对于file_list中的f:
im = Image.open(scriptDir + str(f))
draw = ImageDraw.Draw(im)
draw.line((0,0)+ im.size,fill =(255,255,255))
draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))
wh = ft.getsize(“GEEXLA B”)
draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,
fill =(255,255,0),font = ft)
draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,
fill =(255,255,0),font = ft)
德尔绘制
im.save(scriptDir +“gxl_”+ str(f))
还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:
我们来看看实际运用
调整图片亮度:
就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:
运行完上面的代码,你就会获得下面这样的图片:
如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:
调整图片对比度
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。
上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:
改变图片的清晰度
如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:
在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。
Pillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!
领取专属 10元无门槛券
私享最新 技术干货