系列:数字图像基础(2)Pillow
一个不错的知乎帖子:学习如何使用Python的Pillow函数库来处理图像。
打开图像——Image.open()函数
Image.open(路径)返回image对象
打开、保存图像
# 导入模块
from PIL import Image
# 打开
img = Image.open('Liya.jpg')
# 保存
img.save('Liya_bk.jpg')
# 转换格式
img.save('Liya_bk.bmp')
图像对象的主要属性
图像格式.format
>>> img1 = Image.open("Liya.jpg")
>>> img2 = Image.open("Liya_bk.bmp")
>>> img1.format
'JPEG'
>>> img2.format
'BMP'
尺寸.size
>>> img.size
(1080, 1440)
色彩模式.mode
>>> img.mode
'RGB'
显示图像
imshow()
img.imshow(image对象/Numpy数组) # 效果:用默认应用打开图像
matplotlib显示多图像
from PIL import Image
import matplotlib.pyplot as plt
# 打开
img = Image.open('Liya.jpg')
img1 = Image.open("Liya.jpg")
img2 = Image.open("Liya_bk.bmp")
plt.figure(figsize=(15, 5))
plt.subplot(131)
plt.axis("off") # 不显示坐标值
plt.imshow(img)
plt.title(img.format)
plt.subplot(132)
plt.axis("off")
plt.imshow(img1)
plt.title(img1.format)
plt.subplot(133)
# plt.axis("off")
plt.imshow(img2)
plt.title(img2.format)
plt.show()
转换图像的色彩模式
取值 | 色彩模式 |
---|---|
1 | 二值图像 |
L | 灰度图像 |
P | 8位彩色图 |
RGB | 24位彩色图 |
RGBA | 32位彩色图 |
CMYK | CMYK彩色图 |
YCbCr | YCbCr彩色图像 |
I | 32位整型灰度图像 |
F | 32位浮点灰度图像 |
# 打开
img = Image.open('Liya.jpg')
# 转换色彩模式
img1 = img.convert("L")
img2 = img.convert("1")
# 保存
img1.save('Liya_L.jpg')
img2.save('Liya_1.jpg')
颜色通道的分离与合并
img.split()
Image.merge(色彩模式, 图像列表)
from PIL import Image
import matplotlib.pyplot as plt
# 打开
img = Image.open('Liya.jpg')
# 通道分离
img_r, img_g, img_b = img.split()
plt.figure(figsize=(10, 10))
plt.subplot(221)
plt.axis("off") # 不显示坐标值
plt.imshow(img_r, cmap='gray')
plt.title('R', fontsize=20)
plt.subplot(222)
plt.axis("off")
plt.imshow(img_g, cmap='gray')
plt.title('G', fontsize=20)
plt.subplot(223)
plt.axis("off")
plt.imshow(img_b, cmap='gray')
plt.title('B', fontsize=20)
# 合并后的图像
img_rgb = Image.merge("RGB", [img_r, img_g, img_b])
plt.subplot(224)
plt.axis("off")
plt.imshow(img_rgb)
plt.title('B', fontsize=20)
plt.show()
转化为数组
from PIL import Image
import numpy as np
# 打开
img = Image.open('Liya.jpg')
# 转换为ndarray
arr_img = np.array(img)
arr_img.shape
(1440, 1080, 3)
type(arr_img)
<class 'numpy.ndarray'>
改变数组:明暗互换
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 打开
img = Image.open('Liya_L.jpg')
# 转换为ndarray
arr_img = np.array(img)
arr_img2 = 255 - arr_img # 明暗互换
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.axis("off")
plt.imshow(arr_img, cmap='gray')
plt.subplot(122)
plt.axis("off")
plt.imshow(arr_img2, cmap='gray')
plt.show()
缩放图像
from PIL import Image
img = Image.open('Liya_L.jpg')
# 方法一:resize(),新对象,不改变源对象
img2 = img.resize((100, 100))
# 方法二:thumbnail(),返回None,改变源对象
img.thumbnail((100, 100))
旋转、镜像
参数 | 功能 |
---|---|
Image.FLIP_LEFT_RIGHT | 水平翻转 |
Image.FLIP_TOP_BOTTOM | 上下翻转 |
Image.ROTATE_90 | 逆时针旋转90° |
Image.ROTATE_180 | 逆时针旋转180° |
Image.ROTATE_270 | 逆时针旋转270° |
Image.TRANSPOSE | 将图像进行转置 |
Image.TRANSVERSE | 将图像进行转置,再水平翻转 |
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
# 打开
img = Image.open('Liya.jpg')
img2 = img.transpose(Image.TRANSPOSE) # 转置
img3 = img.transpose(Image.TRANSVERSE) # 转置 + 上下翻转 + 左右翻转
plt.figure(figsize=(10, 5))
plt.subplot(131)
plt.axis("off")
plt.imshow(img, cmap='gray')
plt.subplot(132)
plt.axis("off")
plt.imshow(img2, cmap='gray')
plt.subplot(133)
plt.axis("off")
plt.imshow(img3, cmap='gray')
plt.show()
裁剪图像
# 用法
# img.crop((x0, y0, x1, y1)) 左上角、右下角,返回图像对象
from PIL import Image
# 打开
img = Image.open('Liya_L.jpg')
# 剪裁
img2 = img.crop((0, 700, 700, 1400))
# 保存
img2.save('Liya_cut.bmp')