开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
前言
在本节中,我们将学习实现六种不同的算法,以将 RGB
彩色图像(具有 R
、G
、B
三个颜色通道的图像)转换为灰度图像。我们首先介绍不同算法的原理,然后在 rgb2gray()
函数中实现这些算法。
算法原理
首先,介绍多种不同的强度 (intensity
) 算法,将 RGB
转换为灰度图像的最简单方法是计算三个颜色通道的平均值:
或者通过使用 RGB
通道的加权组合来与人类的亮度感知相匹配,加权计算公式如下:
我们也可以通过获取 RGB
通道的最大值来计算最终的灰度值:
我们也可以通过亮度 (luster
)来获取最终灰度强度值,其中亮度是色调、亮度和饱和度 (HLS
) 颜色空间中的L通道,亮度是 RGB
中最小和最大通道值的平均值:
或者,我们可以使用 Lab
色彩空间的 L
通道,将图像从 RGB
空间转换为 Lab
颜色空间,并提取 L
(强度)通道值。
最后,我们也可以使用 RGB
色彩空间的 R
通道,即从 RGB
图像中提取红色通道,等效的,我们也可以提取 G
或 B
通道。
将 RGB 图像转换为灰度图像
首先,导入所需的库并定义 rgb2gray()
函数,使用该函数实现上述六种计算灰度图像的算法,并返回每种算法的输出灰度图像:
import numpy as np
from skimage.color import rgb2lab
from skimage.io import imread
import matplotlib.pyplot as plt
def rgb2gray(img):
gray_images = {}
gray_images['intensity'] = np.mean(image, axis=2)
gray_images['luminance'] = np.average(image, axis=2, weights=[0.3, 0.59, 0.11])
gray_images['value'] = np.max(image, axis=2)
gray_images['luster'] = (np.max(image, axis=2) + np.min(image, axis=2)) / 2
gray_images['Lab L'] = rgb2lab(img)[...,0]
gray_images['RGB R'] = img[...,0]
return gray_images
读取并绘制原始图像:
image = imread('1.png')
plt.figure(figsize=(5,5))
plt.imshow(image), plt.axis('off'), plt.title('RGB image', size=10)
plt.show()
调用函数 rgb2gray()
,绘制不同算法生成的灰度图像:
gray_images = rgb2gray(image)
i = 1
plt.figure(figsize=(15,10))
plt.gray()
for gray_type in sorted(gray_images):
plt.subplot(2,3,i), plt.imshow(gray_images[gray_type]), plt.axis('off'), plt.title(gray_type, size=10)
i += 1
plt.suptitle('Conerting RGB to GrayScale image with different methods', size=25)
plt.show()