定义
首先,前文提到,图片的存储是一个三位数组,并且有RGB三色通道,所以可以展现多种色彩,但对灰度图来说,它只有一种色调。所以它是一个二维数组
灰度图:单通道图,每个像素点只存一个像素值,图像整体表现为灰色,从0-255表现为从黑到白的过程。
三种方法
对图片进行灰度化也就是改变其三信道的信道值,使其整体呈就灰色
1.加权平均法
加权平均法:对于彩色图像的每个像素【每个像素包含 RGB三通道】,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值,权重的比例为: R乘以0.299,G乘以0.587,B乘以0.114。
2.平均值法:
平均值法:对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。
3.最大值法
最大值法:对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。
代码
import numpy as np
import matplotlib.pyplot as pltimg = plt.imread("./flower.png")img_gray = np.zeros_like(img)#下面三种方法演示时三选一即可# 1.使用加权均值法进行灰度化
for i in range(img_gray.shape[0]):for j in range(img_gray.shape[1]):img_gray[i, j, :] = (img[i, j, 0]*0.299 + img[i, j, 1]*0.587 + img[i, j, 2]*0.114)# 2.使用平均值法进行灰度化
for i in range(img_gray.shape[0]):for j in range(img_gray.shape[1]):img_gray[i, j, :] = (img[i, j, 0] + img[i, j, 1] + img[i, j, 2]) / 3# 3.使用最大值法进行灰度化
for i in range(img_gray.shape[0]):for j in range(img_gray.shape[1]):img_gray[i, j, :] = max(img[i, j, 0] , img[i, j, 1] , img[i, j, 2])plt.subplot(121)
plt.imshow(img)plt.subplot(122)
plt.imshow(img_gray)plt.tight_layout()
plt.show()
无论何种方式,都是对三信道值做出综合处理,然后把相对灰度化的 信道值 赋值给 单信道。
上述代码只为演示原理,在opencv库中已经封装了有关灰度化的接口,我们直接调用下面的函数即可,一行搞定,下面有详细介绍
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.cvtColor()函数
功能:用于转换图像从一个颜色空间到另一个颜色空间
参数:
- src: 输入图像,这是一个包含图像数据的 NumPy 数组。
- code: 用于指定颜色空间转换的代码,它是一个整数标识符,表示源颜色空间和目标颜色空间之间的转换。OpenCV 提供了多种转换代码,如 cv2.COLOR_BGR2GRAY(从 BGR 转换到灰度图),cv2.COLOR_RGB2HSV(从 RGB 转换到 HSV),等等。
- dst: 输出图像,与输入图像具有相同的大小和深度。这是一个可选参数,如果不提供,函数会创建一个新的图像来存储转换结果。
- flags: 一个可选的标志,用于指定颜色转换的一些特定选项。在大多数情况下,这个参数可以省略,因为它有默认值。
函数返回值:
- dst: 转换后的图像,这是一个包含新颜色空间图像数据的 NumPy 数组。