OpenCV-图像通道转换问题
OpenCV-MAT对象中使用plt.imshow(img[:,:,::-1])如何实现将第二轴反向?
系统平台:win10 x64
一、明确几个概念:
1.OpenCV内部每个通道并没有固定对应某种颜色,只是在用imshow()、imread()、imwrite()等函数时,才将通道按照蓝、绿、红的顺序进行输入和输出;
3.img图像的shape和strides属性:
如:
>>>img[:].shape
(100,300,3) #数组第0个(或第0轴)为:图像的垂直尺寸(高度)——行数,第1个(或第1轴)为:图像的水平尺寸(宽度)——列数,第2个(或第2轴)为:图像的通道数
>>>img[:].strides
(900,3,1) #每个通道的数据占用1个字节,而一个像素点占用3个字节,一行数据占用:300*3=900个字节,因此,图像在内存中是连续存储的
注意:
- Mat对象本身提供的很多属性和方法并不符合python风格,因此PyOpenCV对Mat类进行了扩展,使得它能像NumPy数组一样使用
- Mat对象本身并不是数组,因此它没有shape属性,所以:>>>img.shape #会报错:AttributeError: 'Mat' object has no attribute 'shape'
4.python切片操作:
如: #s[a:b:c]形式是对s在a和b之间以c为间隔取值,c可以为负,负值意味着反向取值
>>>s = 'bicyle'
>>>s[::3]
'bye'
>>>s[::-1]
'elycib'
>>>s[::-2]
'eccb'
二、说明:img[:,:,::-1]
中括号中有两个逗号,四个冒号
[:,:,::-1]
第一个冒号——取遍图像的所有行数
第二个冒号——取遍图像的所有列数
第三个和第四个冒号——取遍图像的所有通道数,-1是反向取值
所以,如果一幅300*100的彩色图像,
执行img[:,:,::-1]后行列不变,通道数方向,由R、G、B更改为B、G、R,即第二轴反向
若是执行img[1:4,5:10,1:3:-1]后,第1行到第3行,第5列到第9列,第1通道到第2通道上的数据反向,即——第1行到第3行,第5列到第9列由R、G、B更改为R、B、G
附测试代码及其他方法:
#coding=utf-8
#OpenCV读进来的图像,通道顺序为BGR, 而matplotlib的顺序为RGB,因此需要转换
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('./test1.jpg')
B, G, R = cv2.split(img)
#BGR转RGB,方法1
img_rgb1 = cv2.merge([R, G, B])
#BGR转RGB,方法2
img_rgb2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#BGR转RGB,方法3
img_rgb3 = img[:,:,::-1]
plt.figure('BGR_RGB')
#显示opencv读进来的img, 通道顺序BGR
plt.subplot(3,3,1), plt.imshow(img)
#显示B通道
plt.subplot(3,3,4), plt.imshow(B)
#显示B通道
plt.subplot(3,3,5), plt.imshow(G)
#显示B通道
plt.subplot(3,3,6), plt.imshow(R)
#显示将BGR转为RGB的图像,3种方法
plt.subplot(3,3,7), plt.imshow(img_rgb1)
plt.subplot(3,3,8), plt.imshow(img_rgb2)
plt.subplot(3,3,9), plt.imshow(img_rgb3)
plt.show()
OpenCV-图像通道转换问题的更多相关文章
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
- Python-OpenCV中图像颜色空间转换
目录 cv2.cvtColor() 1. RGB to GRAY 2. RGB to CIE XYZ 3. RGB to YCrCb JPEG 4. RGB to HSV 5. RGB to HLS ...
- 关于OpenCV图像操作的默认参数问题
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...
- OpenCV-3.4.3图像通道处理
图像通道处理 图像读取和处理都是按BGR通道顺序进行的 #include <iostream> #include <opencv2/opencv.hpp> #include & ...
- opencv图像的基本操作3
1.获取像素并修改 读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB图像而言,返回RGB的值,对于灰度图则返回灰度值 import cv2 import numpy img = cv2. ...
- Imagelab-0-QT label显示 opencv 图像
Imagelab-0-QT label显示 opencv 图像 opencvc++qtimagelab 开始之前 这其实也是opencv 处理图像的系列, 只是想我们在进一步复杂化我们的代码之前, 每 ...
- <学习opencv>图像和大型阵列类型
OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...
- 用python简单处理图片(2):图像通道\几何变换\裁剪
一.图像通道 1.彩色图像转灰度图 from PIL import Image import matplotlib.pyplot as plt img=Image.open('d:/ex.jpg') ...
- 【转】OpenCV与CxImage转换(IplImage)、IplImage QImage Mat 格式互转
最近由于在项目中用到了Opencv库,但是为了更好的显示图像还是使用了Cximage库,它可以快捷地存取.显示.转换各种图像.Opencv库用于高级图像处理与识别.为了使Cximage图像与Openc ...
随机推荐
- 原生js实现ajax与jquery的ajax库,及json
这是一篇笔记博客, Ajax: 和服务器进行数据交换(异步) 用js实现复杂的原理:用于发送请求的对象在不同的浏览器中是不同的 同源策略:ajax发送请求的url地址与服务器地址必须是同一域名,协议, ...
- HDU 1698 Just a Hook(线段树区间更新查询)
描述 In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes ...
- 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...
- 8.21 :odd??:nth-of-type??
今天为了实现隔行变色,我在css里写: .note:odd{ background-color: #eee; } 有一个页面有效果,另一个页面没效果,怎么也找不到原因...各种尝试各种清缓存都不行,, ...
- docker数据卷(转)
原文地址:http://www.cnblogs.com/zydev/p/5809616.html Docker-数据卷和数据容器卷 容器中管理数据主要有两种方式: 数据卷(Data Volumes) ...
- 关于AndroidStudio的打包数字签名以及多渠道发布
AndroidStudio右侧Gradle里边的build(工程下的)是可以生成未签名的debug和release的apk包生成前可以先clean一下工程 app下的build.gradle里边的 l ...
- 运行SVO
安装与运行的所有文档:https://github.com/uzh-rpg/rpg_svo/wiki 有两种安装方式: 有ros:https://github.com/uzh-rpg/rpg_svo/ ...
- springboot报错Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean
springboot项目在启动时需要把servlet容器编译进去,这时候如果你的maven依赖里面没有配置jetty或者tomcat相关依赖就会报错. 解决方法: jetty添加 <depend ...
- 简单使用limma做差异分析
简单使用limma做差异分析 Posted: 五月 12, 2017 Under: Transcriptomics By Kai no Comments 首先需要说明的是,limma是一个非常全 ...
- 洛谷4782 【模板】2-SAT 问题
原题链接 \(2-SAT\)模板 #include<cstdio> using namespace std; const int N = 2e6 + 10; int fi[N], di[N ...