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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
python绘制圆柱体的方法
Jul 02 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
Python PO设计模式的具体使用
Aug 16 Python
python异常处理之try finally不报错的原因
May 18 Python
django 外键创建注意事项说明
May 20 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
python3中编码获取网页的实例方法
Nov 16 Python
Python数据分析入门之教你怎么搭建环境
May 13 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
全国FM电台频率大全 - 2 天津市
2020/03/11 无线电
第一个无线电台是由谁发明的
2021/03/01 无线电
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
BBS(php & mysql)完整版(三)
2006/10/09 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
javascript实现计算器功能
2020/03/30 Javascript
快速了解Python相对导入
2018/01/12 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
简单了解python关系(比较)运算符
2019/07/08 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
公司总经理岗位职责
2014/03/15 职场文书
美术指导求职信
2014/03/17 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
财务工作失职检讨书
2014/11/21 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
结婚仪式主持词
2015/06/29 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
800字作文之大雪
2019/12/04 职场文书