opencv、matplotlib、pillow和pytorch读取数据的通道顺序
文章目录:
- 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读取数据的通道顺序相关推荐
- opencv 中CV_32F和CV_64读取数据结果不一致
我需要读取matlab生成的txt,里面存放着3*3的矩阵,我在尝试用opencv读取txt 并转存为yaml文件时出现了问题. 原始数据 3.2212523e-01 -3.2059794e-02 - ...
- 如何用Pytorch读取自己的数据集
在训练经典的数据集如cifar10,minsit等,可以用官方自带的数据集格式几行就写出来,如果是自己下载的数据集,那么我们应该如何用pytorch来读取呢?其实是有模板可以直接仿照着写的. 本次案例 ...
- 在pytorch中自定义dataset读取数据2021-1-8学习笔记
在pytorch中自定义dataset读取数据 utils import os import json import pickle import randomimport matplotlib.pyp ...
- PyTorch手把手自定义Dataloader读取数据
PyTorch手把手自定义Dataloader读取数据 https://zhuanlan.zhihu.com/p/35698470 pytorch之dataloader深入剖析 https://www ...
- 一个简单的更改让PyTorch读取表格数据的速度提高20倍:可大大加快深度学习训练的速度...
来源:DeepHub IMBA 本文约3000字,建议阅读5分钟 我在PyTorch中对表格的数据加载器进行的简单更改如何将训练速度提高了20倍以上,而循环没有任何变化! 深度学习:需要速度 在训练深 ...
- extjs 表格数据重新加载_一个简单的更改让PyTorch读取表格数据的速度提高20倍:可大大加快深度学习训练的速度...
来源:DeepHub IMBA 本文约3000字,建议阅读5分钟我在PyTorch中对表格的数据加载器进行的简单更改如何将训练速度提高了20倍以上,而循环没有任何变化! 深度学习:需要速度 在训练深度 ...
- pytorch dataset读取数据流程_高效 PyTorch :如何消除训练瓶颈
加入极市专业CV交流群,与 10000+来自港科大.北大.清华.中科院.CMU.腾讯.百度 等名校名企视觉开发者互动交流! 同时提供每月大咖直播分享.真实项目需求对接.干货资讯汇总,行业技术交流.关注 ...
- Opencv——写入或读取数据到XML或YAML文件
什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...
- PyTorch 读取大数据
PyTorch 读取大数据 数据量太大,必须分批从磁盘加载,下面是单机单卡的思路: from torch.utils.data import Dataset, DataLoader import to ...
最新文章
- Python笔记(2)函数
- cocos对象池的使用
- 巩固一下C语言中的指针
- 基于Hadoop的数据分析平台搭建
- Arduino学习笔记07
- Ubuntu 16.04安装SQLite Browser操作SQLite数据库
- 史上最黑科技 | 人造肌肉、DNA折叠、柔性外骨骼…
- openstack 官方文档配置 Open vSwitch
- 开源审计的最佳时机是什么时候?
- TF2.0—tf.keras.losses.BinaryCrossentropy
- DEFCON China倒计时 没想到炸屏“玩坏”百度
- Flowable官方指定中国社区成立了
- 【报告分享】2021潮购人群洞察报告-巨量算数(附下载)
- Navicat自动运行批处理作业并发送附件邮件
- vuecli打包后html文件没有压缩的问题
- 合肥工业大学计算机网络题库,合肥工业大学试卷计算机系统结构(A、B卷)
- 兔子与狐狸c语言,狐狸和兔子
- 将数据以表格的形式保存到pdf中
- 抖音短视频的推荐机制是什么? 国仁网络资讯
- 使用java计算数组方差和标准差
热门文章
- AngularJS 指令中的require
- 使用vscode调试Nodejs
- 学生信息管理系统(连接数据库,面向对象的方法实现学生信息的增删改查操作)...
- 为什么要做一个靠谱的人?
- [转]如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...
- ubuntu下eclipse中键盘失灵
- 内存管理(链表,指针操作,繁琐)
- Balsamiq Mockups --- 产品设计的利器
- css元素捕捉,css元素选择器
- python使用缩进来体现代码之间的逻辑关系-Python 使用缩进来体现代码之间的逻辑关系 ....