opencv-python的RGB與BGR互轉方式
一、格式轉換
opencv讀取圖片的默認像素排列是BGR,需要轉換。PIL庫是RGB格式。
caffe底層的圖像處理是基于opencv,其使用的顏色通道順序與也是BGR(Blue-Green-Red),而日常圖片存儲時顏色通道順序是RGB。
在Python中,將RGB順序的圖像轉成BGR順序,需要調整channel dimension的各顏色通道順序。
方法1:
img = cv2.imread('001.jpg')
img_ = img[:,:,::-1].transpose((2,0,1))
① 在opencv里,圖格式HWC,其余都是CHW,故transpose((2,0,1))
② img[:,:,::-1]對應H、W、C,彩圖是3通道,即C是3層。opencv里對應BGR,故通過C通道的 ::-1 就是把BGR轉為RGB
注: [::-1] 代表順序相反操作
③ 若不涉及C通道的BGR轉RGB,如Img[:,:,0]代表B通道,也就是藍色分量圖像;Img[:,:,1]代表G通道,也就是綠色分量圖像;Img[:,:,2]代表R通道,也就是紅色分量圖像。
方法2:
使用opencv自帶函數轉換圖像的R通道和B通道。
RGB -> BGR
img_bgr = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR)
BGR->RGB
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
方法3:
BRG轉RGB
rgb = bgr[...,::-1]
RGB轉BGR
bgr = rgb[...,::-1]
RGB轉GBR
gbr = rgb[...,[2,0,1]]
二、其他
添加Batch項一般是caffe2圖像預處理的最后一步,在經過RGB->BGR,圖像增強以及HWC->CHW后,還需要在CHW前添加一個第四維N以記錄圖像樣本數量(即batchsize),所以輸入caffe的圖像格式為(N,C,H,W),其中顏色通道C的順序是BGR。
但是對于TensorFlow這個順序有差別。TensorFlow有兩種數據格式NHWC和NCHW,默認的數據格式是NHWC,可以通過參數data_format指定數據格式。設置為 “NHWC” 時,排列順序為 [batch, height, width, channels];設置為 “NCHW” 時,排列順序為 [batch, channels, height, width]。
兩種數據格式的轉換:
NHWC ?> NCHW:
import tensorflow as tfx = tf.reshape(tf.range(24), [1, 3, 4, 2])out = tf.transpose(x, [0, 3, 1, 2])
NCHW ?> NHWC:
import tensorflow as tfx = tf.reshape(tf.range(24), [1, 2, 3, 4])out = tf.transpose(x, [0, 2, 3, 1])
補充知識:淺談opencv使用BGR而非RGB的原因
使用opencv讀取圖片時, 默認的通道順序是BGR而非RGB,在RGB為主流的當下, 這種默認給我們帶來了一點不便。那么, opencv 為什么要使用BGR而非RGB呢?
目前看到的一種解釋說是因為歷史原因:早期BGR也比較流行,opencv一開始選擇了BGR,到后來即使RGB成為主流,但也不好改了。
(這個觀點未經考證,也沒有嚴肅考證的動力, 在“碰到”新的不同解釋前, 估且就這么認為吧)
References
https://stackoverflow.com/questions/14556545/why-opencv-using-bgr-colour-space-instead-of-rgb
以上這篇opencv-python的RGB與BGR互轉方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。
相關文章: