开启掘金成长之旅!这是我参与「掘金日新计划 · 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()
接下来,在 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()
将带有调色板的 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()
方法计算图像中每个像素值的调色板索引。使用计算的索引从图像调色板中获取每个像素的 R
、G
和 B
值。最后,使用自定义 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()