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实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
Python使用shelve模块实现简单数据存储的方法
May 20 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
python装饰器使用实例详解
Dec 14 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
python 发送邮件的四种方法汇总
Dec 02 Python
Python编写冷笑话生成器
Apr 20 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获取表单中多个同名input元素的值
2014/03/20 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
javascript 异常处理使用总结
2009/06/21 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
python实现图像全景拼接
2020/03/27 Python
PyTorch-GPU加速实例
2020/06/23 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
甲方资料员岗位职责
2013/12/13 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
总经理工作职责范文
2014/03/14 职场文书
爱情寄语大全
2014/04/09 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
法院答辩状格式
2015/05/22 职场文书
盲山观后感
2015/06/11 职场文书
离职证明格式样本
2015/06/12 职场文书
JavaScript实现队列结构过程
2021/12/06 Javascript
再谈python_tkinter弹出对话框创建
2022/03/20 Python