灰度图像能以较少的数据表征图像的大部分特征,因此在某些算法的预处理阶段需要进行彩色图像灰度化,以提高算法的效率。将彩色图像转化为灰度图像的过程称为彩色图像灰度化。
常用RGB图像灰度化,在RGB模型中,位于空间位置(x,y)的像素点的颜色用该像素点的R(x,y)
G(x,y),B(x,y)三个分量表示。灰度图像每个像素用一个灰度值表示即可。
最大灰度化方法将彩色图像中像素的R分量,G分量和B分量三个数值的最大值作为灰度图的灰度值。f(x,y)表示位于空间位置(x,y)处的像素。最大值灰度化方法:
平均值灰度化方法是对三个分量求平均值得到灰度值:
灰度化方法
由于人眼对绿色的敏感度最高,对蓝色敏感度最低,因此可以根据重要性对R,G,B三个分量进行加权平均,得到比较合理的灰度值。
from skimage import io
from matplotlib import pyplot as plt
import numpy as np
img = io.imread("Test.jpg")
# 初始化灰度图
max_gray = np.zeros(img.shape[0:2], dtype='uint8')
ave_gray = np.zeros(img.shape[0:2], dtype='uint8')
weight_gray = np.zeros(img.shape[0:2], dtype='uint8')
for ii in range(img.shape[0]):
for jj in range(img.shape[1]):
r, g, b = img[ii, jj, :]
# 最大值灰度化
max_gray[ii, jj] = max(r, g, b)
# 平均值灰度化
ave_gray[ii, jj] = (r + g + b) / 3
# 加权平均值灰度化
weight_gray[ii, jj] = 0.3 * r + 0.59 * g + 0.11 * b
# 显示
plt.figure()
plt.axis('off')
plt.imshow(img)
plt.figure()
plt.axis('off')
plt.imshow(max_gray, cmap='gray')
plt.figure()
plt.axis('off')
plt.imshow(ave_gray, cmap='gray')
plt.figure()
plt.axis('off')
plt.imshow(weight_gray, cmap='gray')
plt.show()
RGB图像:
最大值灰度化图像:
平均值灰度化图像:
加权平均灰度化图像:
观察上图,发现加权平均灰度化方法所得灰度图像效果较好。
函数灰度化
也可以使用skimage.color
模块中的rgb2gray
函数来将彩色图像转换为灰度图像。
from skimage.color import rgb2gray
import matplotlib.pyplot as plt
# 读取彩色图像并显示
image = plt.imread('Test.jpg')
plt.subplot(121)
plt.imshow(image)
# 将彩色图像转换为灰度图像
gray_image = rgb2gray(image)
plt.subplot(122)
# 显示灰度图像
plt.imshow(gray_image, cmap='gray')
plt.show()
对比发现此函数生成的灰度图像与加权平均灰度化方法实现极为接近。