文章目录:

  • 1 opencv读取数据的通道顺序
    • 1.1 opencv读取数据相关说明
    • 1.2 显示opencv读取的数据
  • 1.3 把opencv读取的BGR转换RGB的三种方式
  • 2 matplotlib读取数据的通道顺序
    • 2.1 matplotlib读取数据相关说明
    • 2.2 把numpy数组类型转换为pillow类型
  • 3 pillow读取数据的通道顺序
    • 3.1 pillow读取数据相关说明
    • 3.2 把pillow类型转换为numpy类型
  • 4 pytorch读取数据的通道顺序
  • 5 全部完整代码

1 opencv读取数据的通道顺序

1.1 opencv读取数据相关说明

  • opencv默认读取的颜色通道顺序是:BGR
  • opencv读取的数据类型numpy数组,是uint8的整型数据,范围为0-255
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import torch
from torchvision import datasets, models, transforms#1 opencv读取数据的通道顺序  默认读取的颜色通道是BGR  数据通道顺序是 hwc
def opencv_channel(img_path, show_mode=1):image = cv2.imread(img_path)print(f"image type: {type(image)}, image shape: {image.shape}")  # image shape: (305, 500, 3)   h w c# image type: <class 'numpy.ndarray'>, image shape: (305, 500, 3)print(f"image type: {image.dtype}")  # image type: uint8print(f"min value: {np.min(image)}, max value: {np.max(image)}")  # min value: 0, max value: 255if show_mode == 1:# 如果用matplotlib显示opencv读取的图片,图片会发蓝,这是因为opencv读取的颜色通道顺序是BGR,而matplotlib读取的颜色通道顺序是RGBplt.imshow(image)plt.title("opencv BGR")plt.show()elif show_mode == 2:cv2.imshow("image", image)cv2.waitKey(0)# 使用plt正确显示opencv读取的数据,需要改变颜色通道顺序  BGR2RGB# 下面三种方法都可以 把opencv读取的BGR颜色通道顺序 更改为 RGB颜色通道顺序# 方法一:cvColor_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 方法二:b, g, r = cv2.split(image)cvColor_image2 = cv2.merge([r, g, b])# 方法三:cvColor_image3 = image[:, :, :: -1]if show_mode == 1:plt.imshow(cvColor_image)plt.title("BGR2RGB")plt.show()elif show_mode == 2:cv2.imshow("image", cvColor_image)cv2.waitKey(0)if __name__ == '__main__':img_path = "./bee.jpg"opencv_channel(img_path)

1.2 显示opencv读取的数据

1、使用cv2.imshow()

这种显示的是正常的

2、使用plt.imshow()显示opencv读取数据

你会发现显示如下,这是因为plt默认显示的颜色通道顺序为RGB,因此我们需要把opencv读取的数据从BGR转换为RGB

1.3 把opencv读取的BGR转换RGB的三种方式

1、方法一:

cvColor_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

2、方法二:

b, g, r = cv2.split(image)
cvColor_image2 = cv2.merge([r, g, b])

3、方法三:

cvColor_image3 = image[:, :, :: -1]

BGR转换为RGB之后,再用plt.imshow()进行显示,可以发现颜色已经正常了!

2 matplotlib读取数据的通道顺序

2.1 matplotlib读取数据相关说明

  • plt.imread()默认读取的颜色通道顺序是:RGB
  • plt.imread()读取的数据类型numpy数组,是uint8的整型数据,范围为0-255
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import torch
from torchvision import datasets, models, transforms#2 matplotlib读取数据的通道顺序  默认读取的颜色通道是RGB  数据通道顺序是 hwc
def plt_channel(img_path):image = plt.imread(img_path)print(f"image type: {type(image)}, image shape: {image.shape}")# image type: <class 'numpy.ndarray'>, image shape: (305, 500, 3)   h w cplt.imshow(image)plt.title("plt image")plt.show()# 可以把numpy数据转换为pillow数据pil_image = Image.fromarray(image)plt.imshow(pil_image)plt.title("numpy convert to pillow type")plt.show()if __name__ == '__main__':img_path = "./bee.jpg"plt_channel(img_path)

显示结果如下:

2.2 把numpy数组类型转换为pillow类型

也可以把plt读取的numpy数组类型转化为pillow类型

pil_image = Image.fromarray(image)

3 pillow读取数据的通道顺序

3.1 pillow读取数据相关说明

  • pillow默认读取的颜色通道顺序是:RGB
  • pillow自己的数据结构的,但是可以转换成numpy数组,转换后的数组为unit8,0-255
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import torch
from torchvision import datasets, models, transforms#3 pillow读取数据的通道顺序
def pillow_channel(img_path, show_mode=1):image = Image.open(img_path)print(f"image mode: {image.mode}")  # image mode: RGBprint(f"image type: {type(image)}, image shape: {image.size}")# image type: <class 'PIL.JpegImagePlugin.JpegImageFile'>, image shape: (500, 305)   w, hif show_mode == 1:plt.imshow(image)plt.title("pillow image")plt.show()elif show_mode == 2:image.show()# 把pillow数据转换为numpy数据np_image = np.array(image)print(f"image type: {type(np_image)}, image shape: {np_image.shape}")# image type: <class 'numpy.ndarray'>, image shape: (305, 500, 3)   h w cplt.imshow(np_image)plt.title("pillow convert to numpy type")plt.show()if __name__ == '__main__':img_path = "./bee.jpg"pillow_channel(img_path)

因为,pillow默认读取图片的颜色通道也是RGB,因此用plt显示的时候是没有问题的!显示结果如下:

3.2 把pillow类型转换为numpy类型

把pillow类型的数据转换为numpy数组类型数据:

np_image = np.array(image)

4 pytorch读取数据的通道顺序

  • pytorch 读取数据类型为tensor
  • pytorch读取数据类型的通道顺序为:NCHW
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import torch
from torchvision import datasets, models, transforms#4 pytorch读取数据的通道顺序
def torch_channel(imgs_dir):# 1、数据增强train_data_transforms = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),])# 2、从目录中读取数据集# 存放数据的目录root_data_dir = imgs_dirtrain_datasets = datasets.ImageFolder(root_data_dir, train_data_transforms)# 3、加载数据增强后的数据train_dataloaders = torch.utils.data.DataLoader(train_datasets,batch_size=2,shuffle=True,num_workers=0)# 遍历读取数据for inputs, labels in train_dataloaders:print(f"inputs shape: {inputs.shape}")print(f"labels shape: {labels.shape}")'''# 输出结果:inputs shape: torch.Size([2, 3, 224, 224])  bs, c, h, w  即:NCHW, tensorflow读取的顺序为NHWClabels shape: torch.Size([2])inputs shape: torch.Size([2, 3, 224, 224])labels shape: torch.Size([2])inputs shape: torch.Size([2, 3, 224, 224])labels shape: torch.Size([2])inputs shape: torch.Size([2, 3, 224, 224])labels shape: torch.Size([2])'''# 可视化其中的图片,batch_size=2, 因此每个batch中有存储两张图片的数据# 先把tensor类型转换为numpy类型np_inputs = inputs.numpy()print(f"np_inputs type: {type(np_inputs)}, np_inputs shape: {np_inputs.shape}")# np_inputs type: <class 'numpy.ndarray'>, np_inputs shape: (2, 3, 224, 224)# 更改图片的数据的通道顺序, NCHW 改为 NHWC   0123   0231np_change_channel = np_inputs.transpose(0, 2, 3, 1 )print(f"np_change_channel type: {type(np_change_channel)}, np_change_channel shape: {np_change_channel.shape}")# np_change_channel type: <class 'numpy.ndarray'>, np_change_channel shape: (2, 224, 224, 3)# 显示图片,这里把每个batch中的两张图片放到一起显示out_image = np.hstack((np_change_channel[0], np_change_channel[1]))# # 如果用opencv显示需要再在转换一下颜色空间,转换为BGR,因为torchvision内部是基于Pillow实现的,默认是RGB颜色通道# out_image = cv2.cvtColor(out_image, cv2.COLOR_RGB2BGR)# cv2.imshow("image", out_image)# cv2.waitKey(0)plt.imshow(out_image)plt.title("pytorch tensor convert to numpy data")plt.show()if __name__ == '__main__':imgs_dir = './hymenoptera/train'torch_channel(imgs_dir)

5 全部完整代码

完整代码如下:

'''
比较 opencv、matplotlib、pillow 和 pytorch读取数据的通道顺序
'''__Author__ = "Shliang"
__Email__ = "shliang0603@gmail.com"import cv2
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import torch
from torchvision import datasets, models, transforms#1 opencv读取数据的通道顺序  默认读取的颜色通道是BGR  数据通道顺序是 hwc
def opencv_channel(img_path, show_mode=1):image = cv2.imread(img_path)print(f"image type: {type(image)}, image shape: {image.shape}")  # image shape: (305, 500, 3)   h w c# image type: <class 'numpy.ndarray'>, image shape: (305, 500, 3)print(f"image type: {image.dtype}")  # image type: uint8print(f"min value: {np.min(image)}, max value: {np.max(image)}")  # min value: 0, max value: 255if show_mode == 1:# 如果用matplotlib显示opencv读取的图片,图片会发蓝,这是因为opencv读取的颜色通道顺序是BGR,而matplotlib读取的颜色通道顺序是RGBplt.imshow(image)plt.title("opencv BGR")plt.show()elif show_mode == 2:cv2.imshow("image", image)cv2.waitKey(0)# 使用plt正确显示opencv读取的数据,需要改变颜色通道顺序  BGR2RGB# 下面三种方法都可以 把opencv读取的BGR颜色通道顺序 更改为 RGB颜色通道顺序# 方法一:cvColor_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 方法二:b, g, r = cv2.split(image)cvColor_image2 = cv2.merge([r, g, b])# 方法三:cvColor_image3 = image[:, :, :: -1]if show_mode == 1:plt.imshow(cvColor_image)plt.title("BGR2RGB")plt.show()elif show_mode == 2:cv2.imshow("image", cvColor_image)cv2.waitKey(0)#2 matplotlib读取数据的通道顺序  默认读取的颜色通道是RGB  数据通道顺序是 hwc
def plt_channel(img_path):image = plt.imread(img_path)print(f"image type: {type(image)}, image shape: {image.shape}")# image type: <class 'numpy.ndarray'>, image shape: (305, 500, 3)   h w cplt.imshow(image)plt.title("plt image")plt.show()# 可以把numpy数据转换为pillow数据pil_image = Image.fromarray(image)plt.imshow(pil_image)plt.title("numpy convert to pillow type")plt.show()#3 pillow读取数据的通道顺序
def pillow_channel(img_path, show_mode=1):image = Image.open(img_path)print(f"image mode: {image.mode}")  # image mode: RGBprint(f"image type: {type(image)}, image shape: {image.size}")# image type: <class 'PIL.JpegImagePlugin.JpegImageFile'>, image shape: (500, 305)   w, hif show_mode == 1:plt.imshow(image)plt.title("pillow image")plt.show()elif show_mode == 2:image.show()# 把pillow数据转换为numpy数据np_image = np.array(image)print(f"image type: {type(np_image)}, image shape: {np_image.shape}")# image type: <class 'numpy.ndarray'>, image shape: (305, 500, 3)   h w cplt.imshow(np_image)plt.title("pillow convert to numpy type")plt.show()#4 pytorch读取数据的通道顺序
def torch_channel(imgs_dir):# 1、数据增强train_data_transforms = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),])# 2、从目录中读取数据集# 存放数据的目录root_data_dir = imgs_dirtrain_datasets = datasets.ImageFolder(root_data_dir, train_data_transforms)# 3、加载数据增强后的数据train_dataloaders = torch.utils.data.DataLoader(train_datasets,batch_size=2,shuffle=True,num_workers=0)# 遍历读取数据for inputs, labels in train_dataloaders:print(f"inputs shape: {inputs.shape}")print(f"labels shape: {labels.shape}")'''# 输出结果:inputs shape: torch.Size([2, 3, 224, 224])  bs, c, h, w  即:NCHW, tensorflow读取的顺序为NHWClabels shape: torch.Size([2])inputs shape: torch.Size([2, 3, 224, 224])labels shape: torch.Size([2])inputs shape: torch.Size([2, 3, 224, 224])labels shape: torch.Size([2])inputs shape: torch.Size([2, 3, 224, 224])labels shape: torch.Size([2])'''# 可视化其中的图片,batch_size=2, 因此每个batch中有存储两张图片的数据# 先把tensor类型转换为numpy类型np_inputs = inputs.numpy()print(f"np_inputs type: {type(np_inputs)}, np_inputs shape: {np_inputs.shape}")# np_inputs type: <class 'numpy.ndarray'>, np_inputs shape: (2, 3, 224, 224)# 更改图片的数据的通道顺序, NCHW 改为 NHWC   0123   0231np_change_channel = np_inputs.transpose(0, 2, 3, 1 )print(f"np_change_channel type: {type(np_change_channel)}, np_change_channel shape: {np_change_channel.shape}")# np_change_channel type: <class 'numpy.ndarray'>, np_change_channel shape: (2, 224, 224, 3)# 显示图片,这里把每个batch中的两张图片放到一起显示out_image = np.hstack((np_change_channel[0], np_change_channel[1]))# # 如果用opencv显示需要再在转换一下颜色空间,转换为BGR,因为torchvision内部是基于Pillow实现的,默认是RGB颜色通道# out_image = cv2.cvtColor(out_image, cv2.COLOR_RGB2BGR)# cv2.imshow("image", out_image)# cv2.waitKey(0)plt.imshow(out_image)plt.title("pytorch tensor convert to numpy data")plt.show()if __name__ == '__main__':img_path = "./bee.jpg"opencv_channel(img_path)plt_channel(img_path)pillow_channel(img_path)imgs_dir = './hymenoptera/train'torch_channel(imgs_dir)

参考:https://www.cnblogs.com/ranjiewen/p/10278234.html
参考:https://blog.csdn.net/cxx654/article/details/104237214 # 还有imagei和scipy
参考:https://blog.csdn.net/qq_36941368/article/details/82998296
参考:https://blog.csdn.net/oLingFengYu/article/details/88033668 # 不同框架通道顺序


创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)

opencv、matplotlib、pillow和pytorch读取数据的通道顺序相关推荐

  1. opencv 中CV_32F和CV_64读取数据结果不一致

    我需要读取matlab生成的txt,里面存放着3*3的矩阵,我在尝试用opencv读取txt 并转存为yaml文件时出现了问题. 原始数据 3.2212523e-01 -3.2059794e-02 - ...

  2. 如何用Pytorch读取自己的数据集

    在训练经典的数据集如cifar10,minsit等,可以用官方自带的数据集格式几行就写出来,如果是自己下载的数据集,那么我们应该如何用pytorch来读取呢?其实是有模板可以直接仿照着写的. 本次案例 ...

  3. 在pytorch中自定义dataset读取数据2021-1-8学习笔记

    在pytorch中自定义dataset读取数据 utils import os import json import pickle import randomimport matplotlib.pyp ...

  4. PyTorch手把手自定义Dataloader读取数据

    PyTorch手把手自定义Dataloader读取数据 https://zhuanlan.zhihu.com/p/35698470 pytorch之dataloader深入剖析 https://www ...

  5. 一个简单的更改让PyTorch读取表格数据的速度提高20倍:可大大加快深度学习训练的速度...

    来源:DeepHub IMBA 本文约3000字,建议阅读5分钟 我在PyTorch中对表格的数据加载器进行的简单更改如何将训练速度提高了20倍以上,而循环没有任何变化! 深度学习:需要速度 在训练深 ...

  6. extjs 表格数据重新加载_一个简单的更改让PyTorch读取表格数据的速度提高20倍:可大大加快深度学习训练的速度...

    来源:DeepHub IMBA 本文约3000字,建议阅读5分钟我在PyTorch中对表格的数据加载器进行的简单更改如何将训练速度提高了20倍以上,而循环没有任何变化! 深度学习:需要速度 在训练深度 ...

  7. pytorch dataset读取数据流程_高效 PyTorch :如何消除训练瓶颈

    加入极市专业CV交流群,与 10000+来自港科大.北大.清华.中科院.CMU.腾讯.百度 等名校名企视觉开发者互动交流! 同时提供每月大咖直播分享.真实项目需求对接.干货资讯汇总,行业技术交流.关注 ...

  8. Opencv——写入或读取数据到XML或YAML文件

    什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...

  9. PyTorch 读取大数据

    PyTorch 读取大数据 数据量太大,必须分批从磁盘加载,下面是单机单卡的思路: from torch.utils.data import Dataset, DataLoader import to ...

最新文章

  1. Python笔记(2)函数
  2. cocos对象池的使用
  3. 巩固一下C语言中的指针
  4. 基于Hadoop的数据分析平台搭建
  5. Arduino学习笔记07
  6. Ubuntu 16.04安装SQLite Browser操作SQLite数据库
  7. 史上最黑科技 | 人造肌肉、DNA折叠、柔性外骨骼…
  8. openstack 官方文档配置 Open vSwitch
  9. 开源审计的最佳时机是什么时候?
  10. TF2.0—tf.keras.losses.BinaryCrossentropy
  11. DEFCON China倒计时 没想到炸屏“玩坏”百度
  12. Flowable官方指定中国社区成立了
  13. 【报告分享】2021潮购人群洞察报告-巨量算数(附下载)
  14. Navicat自动运行批处理作业并发送附件邮件
  15. vuecli打包后html文件没有压缩的问题
  16. 合肥工业大学计算机网络题库,合肥工业大学试卷计算机系统结构(A、B卷)
  17. 兔子与狐狸c语言,狐狸和兔子
  18. 将数据以表格的形式保存到pdf中
  19. 抖音短视频的推荐机制是什么? 国仁网络资讯
  20. 使用java计算数组方差和标准差

热门文章

  1. AngularJS 指令中的require
  2. 使用vscode调试Nodejs
  3. 学生信息管理系统(连接数据库,面向对象的方法实现学生信息的增删改查操作)...
  4. 为什么要做一个靠谱的人?
  5. [转]如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...
  6. ubuntu下eclipse中键盘失灵
  7. 内存管理(链表,指针操作,繁琐)
  8. Balsamiq Mockups --- 产品设计的利器
  9. css元素捕捉,css元素选择器
  10. python使用缩进来体现代码之间的逻辑关系-Python 使用缩进来体现代码之间的逻辑关系 ....