OpenCV-MAT对象中使用plt.imshow(img[:,:,::-1])如何实现将第二轴反向?

系统平台:win10 x64

一、明确几个概念:

1.OpenCV内部每个通道并没有固定对应某种颜色,只是在用imshow()、imread()、imwrite()等函数时,才将通道按照蓝、绿、红的顺序进行输入和输出;

2.我们也可以使用matplotlib的imshow()绘制图像,但是它要求图像的三个通道的存储顺序为RGB;
即OpenCV读进来的图像,通道顺序为BGR, 而matplotlib的顺序为RGB,因此需要转换
>>>img = cv2.imread('./test1.jpg')    #BGR
>>>from matplotlib import pyplot as plt
>>>plt.imshow(img[:,:,::-1])      #转换为RGB
>>>plt.show()      #用matplotlib的imshow()显示图像

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-图像通道转换问题的更多相关文章

  1. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  2. 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 ...

  3. 关于OpenCV图像操作的默认参数问题

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...

  4. OpenCV-3.4.3图像通道处理

    图像通道处理 图像读取和处理都是按BGR通道顺序进行的 #include <iostream> #include <opencv2/opencv.hpp> #include & ...

  5. opencv图像的基本操作3

    1.获取像素并修改 读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB图像而言,返回RGB的值,对于灰度图则返回灰度值 import cv2 import numpy img = cv2. ...

  6. Imagelab-0-QT label显示 opencv 图像

    Imagelab-0-QT label显示 opencv 图像 opencvc++qtimagelab 开始之前 这其实也是opencv 处理图像的系列, 只是想我们在进一步复杂化我们的代码之前, 每 ...

  7. <学习opencv>图像和大型阵列类型

    OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...

  8. 用python简单处理图片(2):图像通道\几何变换\裁剪

    一.图像通道 1.彩色图像转灰度图 from PIL import Image import matplotlib.pyplot as plt img=Image.open('d:/ex.jpg') ...

  9. 【转】OpenCV与CxImage转换(IplImage)、IplImage QImage Mat 格式互转

    最近由于在项目中用到了Opencv库,但是为了更好的显示图像还是使用了Cximage库,它可以快捷地存取.显示.转换各种图像.Opencv库用于高级图像处理与识别.为了使Cximage图像与Openc ...

随机推荐

  1. Maven 添加jar包到本地仓库

    一.使用Maven命令安装jar包 前提:在windows操作系统中配置好了Maven的环境变量,怎么配置请自己百度,这里不介绍,可参考https://jingyan.baidu.com/articl ...

  2. UVA-10054.The Necklace(欧拉回路)解题报告

    2019-02-09-21:55:23 原题链接 题目描述: 给定一串珠子的颜色对,每颗珠子的两端分别有颜色(用1 - 50 之间的数字表示,对每颗珠子的颜色无特殊要求),若两颗珠子的连接处为同种颜色 ...

  3. ES6之对象的简洁表示法

    ES6 允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. let name = 'Pirates of the Caribbean', index = 5, captain = { ...

  4. mac上将代码上传到github

    前言 有时我们会写一些小程序来学习新的知识,但是完事之后过一段时间可能会忘记,最好的办法就是找到原来的代码看一看.现在可以将代码免费托管到一些网站上,其中最著名的非github莫属了, 今天就把这个过 ...

  5. HUABASE :基于列存储的关系型数据库系统

    摘要   HUABASE 是基于列存储的关系型数据库系统.列存储技术的特点是数据查询效率高,读磁盘少,存储空间少,是构建数据仓库的理想架构. HUABASE 实现了多种数据压缩机制.查询优化和稀疏索引 ...

  6. Java_1简介

    1.Java版本 JavaSE  基础标准版 J2ME     小型版 JavaEE   企业版(主要针对Javaweb程序进行开发) 2.Java特点 开源跨平台 跨平台的原因:Java必须先只能装 ...

  7. Volley框架原理

    Volley有如下优点: 1. 自动调度网络请求 2. 多并发请求 (源于开了多个线程)3. 本地Cache自动缓存网络请求结果 4. 支持设置请求优先级 5. 支持取消单个请求或者取消所有请求 6. ...

  8. Python爬虫项目--爬取猫眼电影Top100榜

    本次抓取猫眼电影Top100榜所用到的知识点: 1. python requests库 2. 正则表达式 3. csv模块 4. 多进程 正文 目标站点分析 通过对目标站点的分析, 来确定网页结构,  ...

  9. Android沉浸式状态栏背景色以及字体颜色的修改

    在activity中设置透明状态栏 的思路:    1.让activity的布局全屏 此时布局会和状态栏重叠        2.让布局最上方预留出和状态栏高度一样的高度,将状态栏的背景色设置为透明 效 ...

  10. MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

    Mybatis在与Spring集成的时候可以配置 MapperFactoryBean来生成Mapper接口的代理. 例如 <bean id="userMapper" clas ...