[Python图像处理] 初识PIL
PIL的全称是Python Image Library
本文使用PIL载入图片文件,使用matplotlib显示图片内容
加载图片
假定加载图片名为test.jpg,与python代码文件位于同一目录下。
导入PIL中的image(用于加载、处理图像),导入matplotlib(用于显示图像)
import PIL.Image as image
import matplotlib.pyplot as plt
打开图片:用image.open()打开’test.jpg’,将文件数据返给img图片对象
img = image.open('test.jpg')
使用plt.imshow()将img图片对象加载到plt
plt.imshow(img)
显示plt中的内容(即我们刚刚加载进去的img图片对象)
plt.show()
完整代码为:
import PIL.Image as image
import matplotlib.pyplot as plt
img = image.open('test.jpg')
plt.imshow(img)
plt.show()
img图片对象还有其他很多功能接口:
print(img.size)
size是img图片对象的成员数据,是一个元组,包含了像素宽度和像素高度。
我们也可以像这样计算img的像素点数:
m, n = img.size
print(m * n)
很容易想到,遍历img图片的每一个像素并操作的程序框架如下:
m, n = img.size
for i in range(m):
for j in range(n):
img图片对象是三通道的,每个像素点包含红、绿、蓝三种通道的信息。
img.getpixel()接受一个包含像素点坐标的元组作为传入参数,并传回该点的三通道值。注意传入的是元组,所以不要漏写函数接口括号和元组本身的括号
例如img.getpixel((12,12))就代表了(12,12)的像素点的三通道信息。
输出(12,12)的像素点的三通道信息:
print(img.getpixel((12,12)))
编辑图片
pic = image.new() 生成新的图片对象pic(传入两个参数,第一个是模式字符串(‘L’是8位像素黑白灰色,’RGB’是真彩色),第二个是大小元组)
pic = image.new('L', (80, 100))
pic.putpixel() 设置像素点的三通道信息(传入两个参数,第一个是坐标元组,第二个是颜色,单通道颜色是一个数值(0是黑色),多通道颜色是一个元组)
pic.putpixel((i, j), 0)
存储图片
pic.save() 将图片对象保存为某个文件。(传入两个字符串参数,第一个是文件名,第二个是模式)
pic.save("testresult.jpg", "JPEG")
实例展示
import PIL.Image as image
pic = image.new('L', (80, 100))
for i in range(80):
for j in range(100):
if (i == j):
pic.putpixel((i, j), 0)
else:
pic.putpixel((i, j), 123)
pic.save("testresult.jpg", "JPEG")
import PIL.Image as image
pic = image.new('RGB', (100, 300))
for i in range(100):
for j in range(300):
if ( (i-50)*(i-50)+(j-150)*(j-150) <= 1600 ):
pic.putpixel((i, j), (67,205,128))
else:
pic.putpixel((i, j), (122,197,205))
pic.save("testresult.jpg", "JPEG")
注:程序生成较大图片文件时可能比较慢,直接去点文件资源管理器里的同一图片文件显示的可能是之前的版本,需要耐心等待十秒左右不等(比如1000*3000的图像),也可以换一个新的文件名然后新文件名的图片生成~
注解提示
有人会发现对于.jpg格式,putpixel写入的RGB值和保存再打开后getpixel读出的RGB值往往不一样,这是因为.jpg是有损格式。
可以使用.bmp格式,参数是’BMP’,它也支持三通道的
也可以使用.png格式,参数是’PNG’,不过它读出来是四通道,因为.png多了第四个参数透明度参数,即alpha通道
还没有评论,来说两句吧...