PIL库的简单操作

灰度图和RGB图

灰度图是一个二维数组,每个值都表示这个像素点的灰度值(0到255之间的一个值),数组的维度(shape)则表示这个图片的长宽(单位像素px),先看个例子

from PIL import Image
import numpy as np

data = np.ones((16, 16), dtype=np.uint8)   # 创建一个全1的数组
data = data * 255                          # 数组所有元素乘以255
print(data)
data[4:12, 8] = 0                          # 将中间的一些值置为0
print(data)

img = Image.fromarray(data, 'L') # 将一个二维数组转换成灰度图
img.show()                       # 在屏幕显示图片

我们看一下显示的图片,会看到一个1。然后我们再去看data,你会发现也可以看到一个1。这是不是就很好理解了。

RGB图片是一个三维数组(长,宽,3),其实你完全可以把他看成一个和灰度图一样的二维数组,即维度为(长,宽)。这样每个元素的值就是一个一维数组,而这个一维数组是有三个元素组成的[R, G, B], 而将他转为灰度图也很简单,只需要将这个一维数组按照某种规则转换成一个0-255之间的值就行了,PIL中是这样转换的:L = R * 299/1000 G * 587/1000 B * 114/1000。

RGBA图片则是一个三维数组 (长,宽, 4),如果看成二维数组的话, 每个元素的是一个由四个元素组成的一维数组,即[R, G, B, A], A表示透明度。

PIL库

from PIL import Image
属性
Image.mode: 图片的格式,例如灰度’L’, 彩色’RGB’, ‘RGBA’
Image.size: 图片的尺寸大小
Image.info: 图片的信息

方法
Image.open(path): 打开图片
Image.new(mode, size, color=0): 创建新图片,一般用不到
Image.fromarray(array, mode=None): 将numpy数组转换为图片,可以指定mode
Image.frombytes(mode, size, data, coder_name =‘raw’, **args):从字节流中读取图片,coder_name为解码器
Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256): 将图片转换格式,例如由灰度转换为RGB convert('RGB')
Image.crop(box): 截取图片,box是一个(左,上,右,下)的元组,也就是相对于左上角(0,0)的像素值
Image.draft(mode, size):调整图片大小,一个缩略图,格式为mode,大小为size。也就是说你可以将原来很大的图片缩小到你给定的size
Image.getbands(): RGB图返回(‘R’, ‘G’, ‘B’), 灰度图返回(L, ),知道是干什么了的吧
Image.getbbox(): 举个例子,一个512x512的图片会返回(0, 0, 512, 512),分别是(左,上,右,下)
Image.copy(): 复制图片
Image.getextrema(): 返回最大和最小的值(0-255), 如果是灰度图,则返回所有值的最大和最小值(min, max), 如果是RGB图则返回((Rmin, Rmax), (Gmin, Gmax), (Bmin, Bmax))
Image.getpixel((x, y)): 返回给定位置的像素值, 灰度图为单值,RGB图为一维数组
Image.paste(im, box=None, mask=None): 将一张图片粘贴在该图片,box是粘贴的位置,可以是(0, 0)的元组,即(左,上)开始, 也可以是(左,上,右,下),不给定默认为(0, 0)。mask不知道什么意思
Image.putpixel((x, y), value): 在指定位置修改像素值
Image.resize(size, resample=None): 重新调整图片大小,resample不知道什么意思
Image.rotate(angle, resample=None, expand=None): 旋转图片,expand表示是否扩展图片以显示所有内容,默认不扩展,即旋转后的图片和原始图片大小一样
Image.save(fp, format=None): fp可以为文件名或文件对象,一般写文件名就行。format为保存的图片格式,默认根据文件名后缀选择
Image.show(): 在屏幕上显示该图片
Image.split():将图片分割,如果是RGB则分割成R,G,B三个图像
Image.thumbnail(size, resample=1): 同Image.draft
Image.transpose(): 旋转90度,同Image.rotate(90)
Image.verify(): 判断图片是否损坏
Image.close(): 关闭文件指针,一般不需要

还有一些高级方法就不说了,那些基本用不上,想知道的直接看官方文档吧。

最后,我正在学习一些机器学习的算法,对于一些我需要记录的内容我都会分享到博客和微信公众号(python成长路),欢迎关注。平时的话一般分享一些爬虫或者Python的内容。
lUE1wd.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值