OpenCV中RGB与BGR格式转换及TensorFlow数据布局详解
本文详解OpenCV读取图像默认的BGR格式与PIL库RGB格式的差异及转换方法,包括切片、transpose及cvtColor函数。同时介绍Caffe2与TensorFlow在Batch维度及通道顺序(NHWC/NCHW)上的不同处理逻辑,并提供TensorFlow中两种数据格式的转换代码示例。
OpenCV图像格式转换方法
一、格式转换
OpenCV在读取图片时,默认采用的像素排列顺序为BGR(蓝绿红),因此通常需要进行格式转换。相比之下,PIL库处理图像时使用的是标准的RGB格式。
Caffe框架底层的图像处理依赖OpenCV,其使用的颜色通道顺序同样为BGR。然而,日常存储的图片文件通常采用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维度操作。对于彩色图像,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 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])
OpenCV采用BGR格式的历史原因
补充知识:浅谈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互转方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













