• OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列


    OpenCV读取RGB图像

    在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。

    例如,一张形状为256×256×3的RGB图像,在OpenCV中读取后的格式为[256, 256, 3],其中最后一个维度表示图像的通道数。在OpenCV中,可以通过cv2.imread()函数读取图片,该函数的返回值是一个NumPy数组,表示读取的图像像素值。

    需要注意的是,OpenCV读取的图像像素值是按照BGR顺序排列的,而不是RGB顺序。因此,如果需要将OpenCV读取的图像转换为RGB顺序,可以使用cv2.cvtColor()函数进行转换。

    OpenCV读取一张RGB图像时,它会将像素数据按照BGR的顺序排列,对于一张3×3的RGB图像,其像素信息在内存中的排列方式如下所示:

    [
    [[B G R] [B G R] [B G R]],
    [[B G R] [B G R] [B G R]],
    [[B G R] [B G R] [B G R]], ]
    
    • 1
    • 2
    • 3
    • 4

    可知,每一个像素点都由三个值组成,分别表示该像素点在蓝色、绿色和红色通道中的颜色值,而整张图像的像素数据则按照BGR的顺序排列。

    在PyTorch中读取RGB图像

    PyTorch接收的RGB图像通常采用CHW格式。在PyTorch中,RGB图像的像素值通常采用浮点数的形式表示,并且像素值的范围通常是[0, 1]或[-1, 1]。

    一般pytorch中的tensor,即网络的输入,要转换为plane的格式,即rrrgggbbb。

    [
    [[R R R] [R R R] [R R R]],
    [[G G G] [G G G] [G G G]],
    [[B B B] [B B B] [B B B]], ]
    
    • 1
    • 2
    • 3
    • 4

    在PyTorch中,模型接收的RGB图像通常采用CHW格式,即按照通道数、高度和宽度的顺序排列像素信息的方式。

    具体来说,假设某个像素点的坐标为(i, j),其在内存中的存储位置可以表示为:

    offset = i * W * C + j * C

    其中,i表示该像素点在第二维中的位置,j表示该像素点在第三维中的位置,C表示通道数,W表示宽度。这个公式可以计算出该像素点在内存中的偏移量,从而可以访问该像素点的RGB值。

    实验

    1 生成一张图片

    from PIL import Image
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 用随机数模拟一张图像
    image = np.random.randint(256, size=60)
    image = image.reshape((5,4,3))
    image_hwc = np.uint8(image)
    
    # 展示图像
    image_show = Image.fromarray(image_hwc)
    plt.imshow(image_show)
    plt.show()
    
    # 打印图像像素值,[h, w, c]格式
    print(image_hwc)
    
    # 打印像素值,[c, h, w]格式
    image_chw = np.transpose(image_hwc, (2,0,1))
    print(image_chw)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    以上代码模拟生成的图像如下图所示,图中有5行4列总共20个像素。
    在这里插入图片描述

    上图的所有像素及其像素值如下图所示,[h, w, c]格式。可以看出,最里层的括号内为单个像素在三个通道上的像素值。

    我们看这种维度的一个方法是:看最后一个维度的含义,[h,w,c]最后一个维度是3,因此意味着最小的颗粒度维度是3。

    在这里插入图片描述
    如果以[c, h, w]格式表示的话,应该是下图这样的:
    看最后一个维度的含义,[c,h,w]最后一个维度是w(我们实验中是4),因此意味着最小的颗粒度维度是4。

    我们想象,一束光通过三棱镜后分解为彩色光,我们取出其中一个频段的数据,把这个频段的数据进行二维排列,就是该通道的情况。

    在这里插入图片描述

    2 CHW和HWC的本质

    本质是一个规范,排列多维度的数据的规范,换句话说,就是定义了一个数据类型的结构体。

    转换过程

    1. 其实数据可以看做是一堆无序的数据,轴的存在让这些数据按照一定层级及次序排布
    2. 转换前的数据是这样排布的,先按照图像高分成3堆,对这3堆的每一堆按照图像图像宽分2堆,分好的2堆分别按照通道数分成3堆
    3. 转换后的数据排布顺序变了,它先按照通道数分成3堆,分好的3堆各自按照图像高分成3堆,再按照图像宽分成2堆。

    在这里插入图片描述

    参考

    https://blog.csdn.net/hh1357102/article/details/130622666
    https://zhuanlan.zhihu.com/p/476310426

  • 相关阅读:
    Flume原理概述与配置文件编写说明
    关于青语言语法设计的讨论
    企业备份解决方案:保护您的企业虚拟机安全!
    2024考研计算机考研复试-每日重点(第二十期)
    【评论内容关键词提取】多种主流提取算法与大模型测试
    python基础(一)、列表的创建和操作
    前序中序、中序后序以及前序后序构造二叉树
    .NET性能优化-使用SourceGenerator-Logger记录日志
    Android 开发RxJava2常用操作符
    requests请求douban.com获得网页源代码
  • 原文地址:https://blog.csdn.net/djfjkj52/article/details/133375422