将 RGB 图像转换为灰度图像算法

433 阅读2分钟

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

前言

在本节中,我们将学习实现六种不同的算法,以将 RGB 彩色图像(具有 RGB 三个颜色通道的图像)转换为灰度图像。我们首先介绍不同算法的原理,然后在 rgb2gray() 函数中实现这些算法。

算法原理

首先,介绍多种不同的强度 (intensity) 算法,将 RGB 转换为灰度图像的最简单方法是计算三个颜色通道的平均值:

V=(R+G+B)/3V = (R+G+B)/3

或者通过使用 RGB 通道的加权组合来与人类的亮度感知相匹配,加权计算公式如下:

V=0.3R+0.59G+0.11BV = 0.3R+0.59G+0.11B

我们也可以通过获取 RGB 通道的最大值来计算最终的灰度值:

V=max(R,G,B)V = max(R, G, B)

我们也可以通过亮度 (luster )来获取最终灰度强度值,其中亮度是色调、亮度和饱和度 (HLS) 颜色空间中的L通道,亮度是 RGB 中最小和最大通道值的平均值:

V=(max(R,G,B)+min(R,G,B))/2V = (max(R,G,B) + min(R,G,B))/2

或者,我们可以使用 Lab 色彩空间的 L 通道,将图像从 RGB 空间转换为 Lab 颜色空间,并提取 L (强度)通道值。

最后,我们也可以使用 RGB 色彩空间的 R 通道,即从 RGB 图像中提取红色通道,等效的,我们也可以提取 GB 通道。

将 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()

Figure_21.png

调用函数 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()

Figure_22.png