• numpy PIL tensor之间的相互转换


    图片的读取通常有两种格式,一种是PIL,一种是opencv。两种读取方式存在一些区别

    1. 图片格式不同,Image读入的是“RGB”,Opencv读入的是“BGR”
    2. 读入图片的尺寸不同,Image读入的是 w h,Opencv读入的是h w c。其中w是宽,h是高,c是通道数。
    3. Image读入是Image类无法直接显示其像素点的值(可以转换成numpy显示),Opencv读入的直接是numpy的格式。可以直接显示其像素值。

    PIL和opencv读取图片 

    1. import os.path
    2. from PIL import Image
    3. import cv2
    4. import numpy as np
    5. import matplotlib.pyplot as plt
    6. import torchvision.transforms as transforms
    7. ##Image 读取图片
    8. image = Image.open("1.jpg").convert("RGB")
    9. ##opencv 读取图片
    10. image2 = cv2.imread("1.jpg")
    11. print("Image read",image.size) # w h
    12. print("Opencv read",image2.shape) # h w c

    PIL 读取的图片是PIL格式,需要转换为numpy或者tensor格式进行数据处理。opencv读取的图片直接就是numpy格式。

    PIL与tensor的相互转换

    可以利用torchvision中的transforms类中ToTensor()和ToPILImage()两个函数将PIL的格式和tensor格式互相转换。注意,转换后的像素点发生的变化.

    1. import os.path
    2. from PIL import Image
    3. import cv2
    4. import numpy as np
    5. import matplotlib.pyplot as plt
    6. import torchvision.transforms as transforms
    7. image = Image.open("1.jpg").convert("RGB")
    8. image2 = cv2.imread("1.jpg")
    9. image_tensor = transforms.ToTensor()(image)
    10. image_recover = transforms.ToPILImage()(image_tensor)
    11. image_tensor_add = image_tensor.unsqueeze(0) ##增加一维
    12. print("Image read",image.size) # w h
    13. print("Opencv read",image2.shape) # h w c
    14. print("tensor",image_tensor.size()) #c h w
    15. print("tensor recover to Image",image_recover.size)
    16. print("tensor add ",image_tensor_add.size())

    numpy 和 tensor 相互转换

    1. import os.path
    2. from PIL import Image
    3. import cv2
    4. import numpy as np
    5. import matplotlib.pyplot as plt
    6. import torchvision.transforms as transforms
    7. #方法一:直接转换
    8. image_tensor_from_numpy = transforms.ToTensor()(image)
    9. print("image_tensor_from_numpy: ",image_tensor_from_numpy.shape)
    10. #方法二
    11. image_tensor_from_numpy2 = cv2.cvtColor(image,cv2.COLOR_BGR2RGB) #先将 BGR 变为 RGB
    12. image_tensor_from_numpy2 = torch.from_numpy(image_tensor_from_numpy2.transpose((2, 0, 1)))
    13. # 将 (h,w,c)转换为 (c,h,w)
    14. image_tensor_from_numpy2 = image_tensor_from_numpy2.float().div(255) #归一化到[0,1]
    15. print("image_tensor_from_numpy2 :",image_tensor_from_numpy2.size())
    1. image_numpy_form_Image = np.array(image)
    2. image_numpy_form_Image = cv2.cvtColor(image_numpy_form_Image,cv2.COLOR_RGB2BGR)
    3. print("image_numpy_form_Image ",image_numpy_form_Image.shape)

     注意:PIL和opencv读取的图片格式不同,因此通常进行格式转换

    参考文献:

    pytorch中图片类型的转换——PIL、tensor、numpy_长歌丶采薇的博客-CSDN博客_pil转numpy

    Pytorch中Tensor与各种图像格式(PIL 和 Numpy)的相互转化_Phoenixtree_DongZhao的博客-CSDN博客_pil 转化为numpy 

  • 相关阅读:
    Android本地数据存储(SP、SQLite、Room)
    t2vec 辅助笔记:data_utils
    ABP微服务系列学习-搭建自己的微服务结构(一)
    JVM内部结构图及各模块运行机制总结
    使用seq2seq架构实现英译法
    智慧工地管理平台系统厂家哪家强|喜讯科技
    IO多路转接 ——— select、poll、epoll
    Mendix中的依赖管理:npm和Maven的应用
    442 - Matrix Chain Multiplication (UVA)
    friend友元
  • 原文地址:https://blog.csdn.net/qq_40107571/article/details/126106379