[Python图像处理] 初识PIL

本文介绍了Python图像处理库PIL的基本用法,包括加载图片、显示图片、获取像素信息以及编辑图片。通过示例代码展示了如何使用PIL加载图片、获取像素数据,并通过putpixel方法编辑图片,同时提醒了在处理不同格式图片时需要注意的问题,如.jpg格式的有损压缩。

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通道

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值