• OpenCV-图像通道转换问题


    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()

  • 相关阅读:
    【转】130 个相见恨晚的超实用网站,一次性分享出来
    基于maven testng extentreport git jenkins 持续自动化测试
    TestNG与ExtentReport集成
    Jenkins集成jSonarQube
    SonarQube & Sonar Scanner
    Jenkins集成jacoco收集单元测试覆盖率
    Jenkins集成jacoco收集集成测试覆盖率
    Jacoco收集单元测试、集成测试和系统功能测试覆盖率
    SoanrQube7.4安装(Window)
    SoanrQube使用maven进行代码分析
  • 原文地址:https://www.cnblogs.com/Alliswell-WP/p/10587500.html
Copyright © 2020-2023  润新知