兩種方法可以實現:
- 通過 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中判斷兩個數組是否相等