opencv-python的RGB與BGR互轉(zhuǎn)方式
一、格式轉(zhuǎn)換
opencv讀取圖片的默認(rèn)像素排列是BGR,需要轉(zhuǎn)換。PIL庫是RGB格式。
caffe底層的圖像處理是基于opencv,其使用的顏色通道順序與也是BGR(Blue-Green-Red),而日常圖片存儲(chǔ)時(shí)顏色通道順序是RGB。
在Python中,將RGB順序的圖像轉(zhuǎn)成BGR順序,需要調(diào)整channel dimension的各顏色通道順序。
方法1:
img = cv2.imread("001.jpg")
img_ = img[:,:,::-1].transpose((2,0,1))
① 在opencv里,圖格式HWC,其余都是CHW,故transpose((2,0,1))
② img[:,:,::-1]對(duì)應(yīng)H、W、C,彩圖是3通道,即C是3層。opencv里對(duì)應(yīng)BGR,故通過C通道的 ::-1 就是把BGR轉(zhuǎn)為RGB
注: [::-1] 代表順序相反操作
③ 若不涉及C通道的BGR轉(zhuǎn)RGB,如Img[:,:,0]代表B通道,也就是藍(lán)色分量圖像;Img[:,:,1]代表G通道,也就是綠色分量圖像;Img[:,:,2]代表R通道,也就是紅色分量圖像。
方法2:
使用opencv自帶函數(shù)轉(zhuǎn)換圖像的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轉(zhuǎn)RGB
rgb = bgr[...,::-1]
RGB轉(zhuǎn)BGR
bgr = rgb[...,::-1]
RGB轉(zhuǎn)GBR
gbr = rgb[...,[2,0,1]]
二、其他
添加Batch項(xiàng)一般是caffe2圖像預(yù)處理的最后一步,在經(jīng)過RGB->BGR,圖像增強(qiáng)以及HWC->CHW后,還需要在CHW前添加一個(gè)第四維N以記錄圖像樣本數(shù)量(即batchsize),所以輸入caffe的圖像格式為(N,C,H,W),其中顏色通道C的順序是BGR。
但是對(duì)于TensorFlow這個(gè)順序有差別。TensorFlow有兩種數(shù)據(jù)格式NHWC和NCHW,默認(rèn)的數(shù)據(jù)格式是NHWC,可以通過參數(shù)data_format指定數(shù)據(jù)格式。設(shè)置為 “NHWC” 時(shí),排列順序?yàn)?[batch, height, width, channels];設(shè)置為 “NCHW” 時(shí),排列順序?yàn)?[batch, channels, height, width]。
兩種數(shù)據(jù)格式的轉(zhuǎn)換:
NHWC –> NCHW:
import tensorflow as tf x = tf.reshape(tf.range(24), [1, 3, 4, 2]) out = tf.transpose(x, [0, 3, 1, 2])
NCHW –> NHWC:
import tensorflow as tf x = tf.reshape(tf.range(24), [1, 2, 3, 4]) out = tf.transpose(x, [0, 2, 3, 1])
補(bǔ)充知識(shí):淺談opencv使用BGR而非RGB的原因
使用opencv讀取圖片時(shí), 默認(rèn)的通道順序是BGR而非RGB,在RGB為主流的當(dāng)下, 這種默認(rèn)給我們帶來了一點(diǎn)不便。那么, opencv 為什么要使用BGR而非RGB呢?
目前看到的一種解釋說是因?yàn)闅v史原因:早期BGR也比較流行,opencv一開始選擇了BGR,到后來即使RGB成為主流,但也不好改了。
(這個(gè)觀點(diǎn)未經(jīng)考證,也沒有嚴(yán)肅考證的動(dòng)力, 在“碰到”新的不同解釋前, 估且就這么認(rèn)為吧)
References
https://stackoverflow.com/questions/14556545/why-opencv-using-bgr-colour-space-instead-of-rgb
以上這篇opencv-python的RGB與BGR互轉(zhuǎn)方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)的登錄驗(yàn)證系統(tǒng)完整案例【基于搭建的MVC框架】
這篇文章主要介紹了Python實(shí)現(xiàn)的登錄驗(yàn)證系統(tǒng),結(jié)合完整實(shí)例形式分析了Python基于搭建的MVC框架進(jìn)行登錄驗(yàn)證操作的相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2019-04-04matplotlib實(shí)現(xiàn)區(qū)域顏色填充
這篇文章主要為大家詳細(xì)介紹了matplotlib實(shí)現(xiàn)區(qū)域顏色填充,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03python將一組數(shù)分成每3個(gè)一組的實(shí)例
今天小編就為大家分享一篇python將一組數(shù)分成每3個(gè)一組的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python 啟動(dòng)時(shí)選擇32位 或64位版的操作
這篇文章主要介紹了Python 啟動(dòng)時(shí)選擇32位 或64位版的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03講清楚fit_transform()和transform()的區(qū)別及說明
這篇文章主要介紹了講清楚fit_transform()和transform()的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02pandas對(duì)齊運(yùn)算的實(shí)現(xiàn)示例
本文主要介紹了pandas對(duì)齊運(yùn)算的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10