使用 PIL 将彩色图像转换为灰度图像

83 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

前言

在本节中,我们将学习 PIL 图像模式以及如何将带有调色板的 PNG 彩色图像转换为灰度图像。最简单的方法是使用 convert() 函数将图像的色彩模式从彩色图像转换为灰度图像。

使用 convert() 函数

首先,导入所需的库,并使用 PIL 图像类的方法将图像从磁盘读取到图像对象,使用 matplotlib 绘制原始 PNG 图像:

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

img = Image.open('1.png')
print(img.mode)

plt.imshow(img)
plt.axis('off')
plt.title('Original Image')
plt.show()

Figure_18.png

接下来,在 image 对象上,需要调用方法 convert() 转换图像色彩模式,将其转换为灰度图像,然后绘制输出图像:

img = img.convert('RGB').convert('L')
print(img.mode)
plt.imshow(img, cmap='gray')
plt.axis('off')
plt.title('Grayscale Image')
plt.show()

Figure_19.png

将带有调色板的 PNG 图像转换为灰度图像

还有另一种使用PIL库将图像转换为灰度图像的方法,相较于上一种方法,这是一种更复杂的方式。但使用这种方法可以明确理解图像如何以 PIL 格式进行存储。

首先导入所有所需的库,并定义函数 rgb2gray() 以从 RGB 彩色图像计算灰度图像强度值,读取 PNG 图像并提取图像调色板:

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

def rgb2gray(R, G, B):
    return 0.2989 * R + 0.5870 * G + 0.1140 * B

img = Image.open('2.png')   # 读取 png 图像
pal = img.getpalette()      # 获取调色板

使用 PIL image 类的 getpixel() 方法计算图像中每个像素值的调色板索引。使用计算的索引从图像调色板中获取每个像素的 RGB 值。最后,使用自定义 rgb2gray() 函数(或使用 scikit-image.color 模块中的相同函数)计算与图像中相同位置对应的输出像素的灰度强度值:

arr = np.zeros((img.height, img.width))     # 初始化输出图像
for i in range(arr.shape[0]):
    for j in range(arr.shape[1]):
        idx = img.getpixel((j,i))           # 获取调色板中像素的索引
        R, G, B = pal[3*idx], pal[3*idx+1], pal[3*idx+2] # 获取像素 R,G,B 值
        arr[i,j] = rgb2gray(R, G, B)        # 转换为灰度图像

绘制输出图像:

plt.imshow(arr, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')
plt.show()

Figure_20.png