opencv-python的RGB与BGR互转方式


Posted in Python onJune 02, 2020

一、格式转换

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 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而非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 相关文章推荐
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
python机器学习实战之K均值聚类
Dec 20 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
使用Python实现画一个中国地图
Nov 23 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python简单实现最大似然估计&scipy库的使用详解
Apr 15 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
Django中F函数的使用示例代码详解
Jul 06 Python
Python Socket编程详解
Apr 25 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 #Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 #Python
基于pycharm实现批量修改变量名
Jun 02 #Python
pytorch读取图像数据转成opencv格式实例
Jun 02 #Python
Python使用jupyter notebook查看ipynb文件过程解析
Jun 02 #Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 #Python
Pandas读取csv时如何设置列名
Jun 02 #Python
You might like
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
写得不错的jquery table鼠标经过变色代码
2013/09/27 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
react 生命周期实例分析
2020/05/18 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python中的super()方法使用简介
2015/08/14 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
python字符串与url编码的转换实例
2018/05/10 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
美国最大的骑马用品零售商:HorseLoverZ
2017/01/12 全球购物
存储过程和函数的区别
2013/05/28 面试题
长安大学毕业生自我鉴定
2014/01/17 职场文书
幼教求职信
2014/03/12 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
培训班通知
2015/04/25 职场文书
小学运动会报道稿
2015/07/22 职场文书
周一问候语大全
2015/11/10 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
SpringBoot集成Redis的思路详解
2021/10/16 Redis
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android