颜色与RGBA值
计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值。在Pillow中,RGBA的值表示为由4个整数组成的元组,分别是R、G、B、A。整数的范围0~255。RGB全0就可以表示黑色,全255代表黑色。可以猜测(255, 0, 0, 255)代表红色,因为R分量最大,G、B分量为0,所以呈现出来是红色。但是当alpha值为0时,无论是什么颜色,该颜色都不可见,可以理解为透明。
from PIL import ImageColorprint(ImageColor.getcolor('red', 'RGBA'))# 也可以只以RBG的方式查看print(ImageColor.getcolor('black', 'RGB'))
(255, 0, 0, 255) (0, 0, 0)
图像的坐标表示
图像中左上角是坐标原点(0, 0),这和平常数学里的坐标系不太一样。这样定义的坐标系意味着,X轴是从左到右增长的,而Y轴是从上到下增长。
在Pillow中如何使用上述定义的坐标系表示一块矩形区域?许多函数或方法要求提供一个矩形元组参数。元组参数包含四个值,分别代表矩形四条边的距离X轴或者Y轴的距离。顺序是(左,顶,右,底)
。右和底坐标稍微特殊,表示直到但不包括。可以理解为[左, 右)
和[顶, 底)
这样左闭右开的区间。比如(3, 2, 8, 9)就表示了横坐标范围[3, 7];纵坐标范围[2, 8]的矩形区域。
使用Pillow操作图像
了解了一些基础知识,可以上手了。首先从读取图片开始,很多图像处理库(如opencv)都以imread()
读取图片。Pillow中使用open
方法。
from PIL import Image im_path = r'F:\Jupyter Notebook\csv_time_datetime_PIL\rabbit.jpg'im = Image.open(im_path) width, height = im.size# 宽高print(im.size, width, height)# 格式,以及格式的详细描述print(im.format, im.format_description) im.save(r'C:\Users\Administrator\Desktop\rabbit_copy.jpg') im.show()
(1920, 1080) 1920 1080 JPEG JPEG (ISO 10918)
im.size
返回一个元组,分别是宽和高。show()
方法会调用系统默认图像查看软件,打开并显示。im.format
可查看图像的格式。save()
可保存处理后的图片,如果未经处理,保存后的图像占用的空间(字节数)一般也与原图像不一样,可能经过了压缩。
新建图像
Pillow也可以新建空白图像, 第一个参数是mode即颜色空间模式,第二个参数指定了图像的分辨率(宽x高),第三个参数是颜色。
可以直接填入常用颜色的名称。如'red'
也可以填入十六进制表示的颜色,如
#FF0000
表示红色。还能传入元组,比如(255, 0, 0, 255)或者(255, 0, 0)表示红色。
# 通常使用RGB模式就可以了newIm= Image.new('RGB', (100, 100), 'red') newIm.save(r'C:\Users\Administrator\Desktop\1.png')# 也可以用RGBA模式,还有其他模式查文档吧blcakIm = Image.new('RGB',(200, 100), 'red') blcakIm.save(r'C:\Users\Administrator\Desktop\2.png')# 十六进制颜色blcakIm = Image.new('RGBA',(200, 100), '#FF0000') blcakIm.save(r'C:\Users\Administrator\Desktop\3.png')# 传入元组形式的RGBA值或者RGB值# 在RGB模式下,第四个参数失效,默认255,在RGBA模式下,也可只传入前三个值,A值默认255blcakIm = Image.new('RGB',(200, 100), (255, 255, 0, 120)) blcakIm.save(r'C:\Users\Administrator\Desktop\4.png')
裁剪图像
Image
有个crop()
方法接收一个矩形区域元组(上面有提到)。返回一个新的Image对象,是裁剪后的图像,对原图没有影响。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) cropedIm.save(r'C:\Users\Administrator\Desktop\cropped.png')
看下原图和裁剪后的图像。
复制与粘贴图像到另一个图像
Image
的copy
函数如其名会产生一个原图像的副本,在这个副本上的任何操作不会影响到原图像。paste()
方法用于将一个图像粘贴(覆盖)在另一个图像上面。谁调用它,他就在该Image对象上直接作修改。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) im.paste(cropedIm, (0, 0)) im.show() im.save(r'C:\Users\Administrator\Desktop\paste.png')
im.show()
显示图像发现这时im(即原图)已经被改变。
这如果之后还会用到原图的信息,由于信息被改变就很麻烦。所以paste前最好使用copy()
复制一个副本,在此副本操作,不会影响到原图信息。虽然在程序里原图信息已改变,但由于保存文件时用的其他文件名,相当于改变没有生效,所以查看的时候原图还是没有改变的。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) copyIm = im.copy() copyIm.paste(cropedIm, (0, 0)) im.show() copyIm.save(r'C:\Users\Administrator\Desktop\paste.png')
这回再看原图,没有改变了。这就保证了之后再次使用im时,里面的信息还是原汁原味。来看个有趣的例子。
im = Image.open(im_path) cropedIm = im.crop((700, 100, 1200, 1000)) crop_width, crop_height = cropedIm.size width, height = im.size copyIm = im.copy()for left in range(0, width, crop_width):for top in range(0, height, crop_height): copyIm.paste(cropedIm, (left, top)) copyIm.save(r'C:\Users\Administrator\Desktop\dupli-rabbit.png')
以裁剪后的图像宽度和高度为间隔,在循环内不断粘贴在副本中,这有点像是在拍证件照。
调整图像的大小
resize
方法返回指定宽高度的新Image对象,接受一个含有宽高的元组作为参数。宽高的值得是整数。
im = Image.open(im_path) width, height = im.size resizedIm = im.resize((width, height+(1920-1080))) resizedIm.save(r'C:\Users\Administrator\Desktop\resize.png')
兔子瘦了,可以看到resize不是等比例缩放的。
旋转和翻转图像
rotate()
返回旋转后的新Image对象, 保持原图像不变。逆时针旋转。
im = Image.open(im_path) im.rotate(90).save(r'C:\Users\Administrator\Desktop\rotate90.png') im.rotate(270).save(r'C:\Users\Administrator\Desktop\rotate270.png') im.rotate(180).save(r'C:\Users\Administrator\Desktop\rotate180.png') im.rotate(20).save(r'C:\Users\Administrator\Desktop\rotate20.png') im.rotate(20, expand=True).save(r'C:\Users\Administrator\Desktop\rotate20_expand.png')
由上到下,分别是旋转了90°,180°, 270°、普通的20°,加了参数expand=True
旋转的20°。expand放大了图像尺寸(变成了2174x1672),使得边角的图像不被裁剪(四个角刚好贴着图像边缘)。再看旋转90°、270°时候图像被裁剪了,但是如下查看图像的宽高,确是和原图一样,搞不懂。
im90 = Image.open(r'C:\Users\Administrator\Desktop\rotate90.png') im270 = Image.open(r'C:\Users\Administrator\Desktop\rotate270.png')# 宽高信息并没有改变print(im90.size, im270.size)
(1920, 1080) (1920, 1080)
图像的镜面翻转。transpose()
函数可以实现,必须传入Image.FLIP_LEFT_RIGHT
或者Image.FLIP_TOP_BOTTOM
,第一个是水平翻转,第二个是垂直翻转。
im = Image.open(im_path) im.transpose(Image.FLIP_LEFT_RIGHT).save(r'C:\Users\Administrator\Desktop\transepose_lr.png') im.transpose(Image.FLIP_TOP_BOTTOM).save(r'C:\Users\Administrator\Desktop\transepose_tb.png')
水平翻转看不出来,原图就是水平对称的...
垂直翻转就明显了...
图像过滤
Pillow使用ImageFilter可以简单做到图像的模糊、边缘增强、锐利、平滑等常见操作。
from PIL import Image, ImageFilter im = Image.open(im_path)# 高斯模糊im.filter(ImageFilter.GaussianBlur).save(r'C:\Users\Administrator\Desktop\GaussianBlur.jpg')# 普通模糊im.filter(ImageFilter.BLUR).save(r'C:\Users\Administrator\Desktop\BLUR.jpg')# 边缘增强im.filter(ImageFilter.EDGE_ENHANCE).save(r'C:\Users\Administrator\Desktop\EDGE_ENHANCE.jpg')# 找到边缘im.filter(ImageFilter.FIND_EDGES).save(r'C:\Users\Administrator\Desktop\FIND_EDGES.jpg')# 浮雕im.filter(ImageFilter.EMBOSS).save(r'C:\Users\Administrator\Desktop\EMBOSS.jpg')# 轮廓im.filter(ImageFilter.CONTOUR).save(r'C:\Users\Administrator\Desktop\CONTOUR.jpg')# 锐化im.filter(ImageFilter.SHARPEN).save(r'C:\Users\Administrator\Desktop\SHARPEN.jpg')# 平滑im.filter(ImageFilter.SMOOTH).save(r'C:\Users\Administrator\Desktop\SMOOTH.jpg')# 细节im.filter(ImageFilter.DETAIL).save(r'C:\Users\Administrator\Desktop\DETAIL.jpg')
另外,若是要进行图案、文字的绘制,可使用ImageDraw。Pillow还有其他强大功能,就不一一列举了。
其实,Pillow只是个基础的图像处理库。若不深入图像处理,已经够用。专业人士使用opencv是更好地选择。Python中使用import cv2
开始使用吧!
以上是Python用Pillow(PIL)进行图像操作实例的详细内容。更多信息请关注PHP中文网其他相关文章!

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

选择Python还是C 取决于项目需求:1)如果需要快速开发、数据处理和原型设计,选择Python;2)如果需要高性能、低延迟和接近硬件的控制,选择C 。

通过每天投入2小时的Python学习,可以有效提升编程技能。1.学习新知识:阅读文档或观看教程。2.实践:编写代码和完成练习。3.复习:巩固所学内容。4.项目实践:应用所学于实际项目中。这样的结构化学习计划能帮助你系统掌握Python并实现职业目标。

在两小时内高效学习Python的方法包括:1.回顾基础知识,确保熟悉Python的安装和基本语法;2.理解Python的核心概念,如变量、列表、函数等;3.通过使用示例掌握基本和高级用法;4.学习常见错误与调试技巧;5.应用性能优化与最佳实践,如使用列表推导式和遵循PEP8风格指南。

Python适合初学者和数据科学,C 适用于系统编程和游戏开发。1.Python简洁易用,适用于数据科学和Web开发。2.C 提供高性能和控制力,适用于游戏开发和系统编程。选择应基于项目需求和个人兴趣。

Python更适合数据科学和快速开发,C 更适合高性能和系统编程。1.Python语法简洁,易于学习,适用于数据处理和科学计算。2.C 语法复杂,但性能优越,常用于游戏开发和系统编程。

每天投入两小时学习Python是可行的。1.学习新知识:用一小时学习新概念,如列表和字典。2.实践和练习:用一小时进行编程练习,如编写小程序。通过合理规划和坚持不懈,你可以在短时间内掌握Python的核心概念。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Atom编辑器mac版下载
最流行的的开源编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境