OpenCV中RGB与BGR格式转换及TensorFlow数据布局详解

唐可
唐可
发布时间:2026-10-13 | 4人浏览过
原创

本文详解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互转方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表