>>> from env_helper import info; info()
页面更新时间: 2024-04-06 23:05:07
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.4. 使用 Pillow 处理图像:通道

3.4.1. 分离和合并通道

Pillow 允许处理图像的各个通道,例如RGB图像有R、G、B三个通道。 RGB 意思是红色、绿色、蓝色,有的图像会有R、G、B、A四个通道, A 是Alpha的首字母,是指一张图片的透明和半透明度。 split() 方法分离图像通道,如果图像为单通道则返回图像本身。 merge 函数采用图像的 mode 和 通道元组为参数,将它们合并成新图像。

>>> from PIL import Image
>>> im=Image.open('L1020120.JPG')
>>> print(im.mode)
RGB

将通道分离为R,G,B,A

>>> # r, g, b ,a= im.split()

将通道分离为R,G,B

>>> r,g,b = im.split()

将三个颜色打乱后合并显示。

>>> from matplotlib import pyplot as plt
>>> im = Image.merge("RGB", (b, g, r))
>>> plt.imshow(im)
>>> plt.show()
_images/sec04_pillow-chanel_9_0.png

下面处理交换RGB图像的三个波段,需要注意的是, 如果你的图片是RGBA那么会出现异常,解决方法将图片转换为RGB:

Image.open(image_path).convert("RGB").save(outfile)
>>> Image.open('L1020120.JPG').convert("RGBA").save('./img3_3.png')
>>> im=Image.open('./img3_3.png')
>>> print(im.mode)
>>> plt.imshow(im)
>>> plt.show()
RGBA
_images/sec04_pillow-chanel_11_1.png

3.4.2. 处理单独通道颜色

将RGB进行单独处理

>>> source = im.split()
>>> R, G, B = 0, 1, 2

过滤红色通道

>>> mask = source[R].point(lambda i: i < 100 and 255)

过滤绿色通道

>>> out = source[G].point(lambda i: i * 0.7)

粘贴已处理的通道,红色通道仅限于<100的值

>>> source[G].paste(out, None, mask)
>>> im = Image.merge(im.mode, source)
>>> plt.imshow(im)
>>> plt.show()
_images/sec04_pillow-chanel_19_0.png