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 相关文章推荐
python中的一些类型转换函数小结
Feb 10 Python
Python中文件遍历的两种方法
Jun 16 Python
python中模块查找的原理与方法详解
Aug 11 Python
pandas数据分组和聚合操作方法
Apr 11 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
Django实现微信小程序的登录验证功能并维护登录态
Jul 04 Python
Flask框架路由和视图用法实例分析
Nov 07 Python
Python如何优雅获取本机IP方法
Nov 10 Python
Python实现自动访问网页的例子
Feb 21 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
python 利用panda 实现列联表(交叉表)
Feb 06 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文件向另一个地址post数据,不用表单和隐藏的变量的
2007/03/06 PHP
基于header的一些常用指令详解
2013/06/06 PHP
跟我学Laravel之配置Laravel
2014/10/15 PHP
PHP pear安装配置教程
2016/05/14 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
详解mpvue开发小程序小总结
2018/07/25 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
vue实现抽屉弹窗效果
2020/11/15 Javascript
python实现倒计时的示例
2014/02/14 Python
代码讲解Python对Windows服务进行监控
2018/02/11 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
python脚本后台执行方式
2019/12/21 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
详解python如何引用包package
2020/06/07 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
基于CSS3特效之动画:animation的应用
2013/05/09 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
Yahoo-PHP面试题2
2014/12/06 面试题
会计专业自荐信范文
2013/12/02 职场文书
暑期社会实践方案
2014/02/05 职场文书
校园广播稿100字
2014/10/06 职场文书
Go归并排序算法的实现方法
2022/04/06 Golang
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers