PIL库的简单操作

1,408 阅读4分钟

灰度图和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, codername ='raw', **args):从字节流中读取图片,codername为解码器
  • 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