两种方法可以实现:
- 通过 numpy 自己实现
- 通过 cv2.cvtColor 函数实现,灰度图转 RGB
所谓的灰度图转为三通道,就是三个通道都是一样的信息,相当于相同维度信息的重复,主要是通过 numpy.array 来实现,其实是可以通过类似广播的形式来实现。
1. 每一行赋值相同的内容
>>> a = np.zeros((3,3)) >>> a array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]) >>> b = np.arange(3) >>> b array([0, 1, 2]) >>> a[:, :] = b # 等价于 a[...] = b >>> a array([[0., 1., 2.], [0., 1., 2.], [0., 1., 2.]])
2. 每一列赋值相同的内容
>>> a = np.zeros((3,3)) >>> a array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]) >>> b = np.arange(3) >>> b array([0, 1, 2]) >>> c = b.reshape((3,1)) >>> c array([[0], [1], [2]]) >>> a[...] = c >>> a array([[0., 0., 0.], [1., 1., 1.], [2., 2., 2.]])
3. 灰度图转为RGB三通道
- 灰度图是二维数据,首先通过 np.expand_dims() 增加一个维度
- 然后直接通过赋值即可以填充其他三个通道为相同的信息
原图的 RGB 显示
import cv2 from PIL import Image img = cv2.imread("yingmu.jpg") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) display(Image.fromarray(img))
RGB 转为 灰度图
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) display(Image.fromarray(gray))
灰度图转为 RGB
# 通过 cv2 函数 img = cv2.cvtColor(gray, cv2.COLOR_GRAY2RGB) # 通过 numpy 实现 img_arr = np.zeros_like(img) img_arr[...] = np.expand_dims(gray, axis=-1) # 用来判断两者是否相同,结果是 True (img == img_arr).all()
关于判断两个 numpy.array 是否相同参考博文:Numpy中判断两个数组是否相等