PIL库的简单操作
Posted kanadeblisst
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的内容。
以上是关于PIL库的简单操作的主要内容,如果未能解决你的问题,请参考以下文章