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爬虫之HTTP异常处理
Nov 05 Python
python实现的jpg格式图片修复代码
Apr 21 Python
在Django中进行用户注册和邮箱验证的方法
May 09 Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
Python从函数参数类型引出元组实例分析
May 28 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
python文件操作的简单方法总结
Nov 07 Python
Python %r和%s区别代码实例解析
Apr 03 Python
Python 发送邮件方法总结
Aug 10 Python
详解numpy.ndarray.reshape()函数的参数问题
Oct 13 Python
python元组拆包实现方法
Feb 28 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
PHP答题类应用接口实例
2015/02/09 PHP
关于php开启错误提示的总结
2019/09/24 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
JS之相等操作符详解
2016/09/13 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
关于layui的下拉搜索框异步加载数据的解决方法
2019/09/28 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
python 写一个性能测试工具(一)
2020/10/24 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
阿拉伯书店:Jamalon
2019/07/24 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
求职者应聘的自我评价
2013/10/16 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers