PIL Opencv numpy tensor 汇总

PIL Opencv numpy tensor 汇总

这些库或者对象具有相似功能但具体操作方式又有所不同,本文将从创建(读取,存储),属性(大小),操作(切片,reshape)和相互转换方面,进行汇总介绍。

numpy ndarray 

这个是 python 高性能计算的基础,几乎所有包的实际数据存储本质都是 ndarray 的。

创建

ndarray 的创建一般使用 numpy 提供的几个常用函数 zeros(),ones() 等

import numpy as np

a = np.zeros((3,4,5))

a_like = np.zeros_like(a)

l = np.arange(10)

ndarray 很少涉及序列化和反序列化,这里直接给出操作方法

# 默认情况下,数组以未压缩的原始二进制格式保存在扩展名为npy的文件中
np.save("filename.npy",a)
b = np.load("filename.npy")


# 将数组写入以某种分隔符隔开的文本文件中,默认分隔符为空格
np.savetxt("filename.txt",a)
b =  numpy.loadtxt("filename.txt", delimiter=',')


# 使用数组的 tofile 函数可以方便地将数组中数据以二进制的格式写进文件
# 需要注意的是读取时,需要指定存储是相同的数据类型,否则读取数据不正确
# 同时,读取的数据是一维的,需要人为 reshape
a.tofile("filename.bin")
b = np.fromfile("filename.bin",dtype = **)

除此之外,还有 dump(),dumps() 

属性

  • shape:tuple,表示对应维度大小
  • ndim:int,表示维数
  • size:int,表示总数据量
  • T:ndarray,转置之后的数组
  • dtype:dtype,存储数据的类型

操作

# 转换数组的数据类型
a.astype(np.uint8)

# 返回该数组的浅复制
a.copy()

# 将该数组变换为新的形状,也可以通过直接修改 shape 属性实现
a.reshape((12, 5))

# 交换该数组的坐标轴
a.transpose((2, 0, 1))

# 在指定的坐标轴方向上复制
a=np.arange(4).reshape(2,2)
a=a.repeat(2,axis=1)

# ouput
a = [[0, 0, 1, 1],
 [2, 2, 3, 3]]

ndarray 的元素获取主要基于切片操作进行

a = np.arange(10).reshape((2,5))
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

a[1, 3]  # == a[1][3]
8

a[:, ::-2]
array([[4, 2, 0],
       [9, 7, 5]])

数据转换

  • np.array(), np.asarray():将数据型数据转换成 ndarray,支持 list, Image,tensor 等
  • tolist():list,将数组转化为Python的列表数据
  • tostring():string,将数组转化为Python的字符串数据;fromstring()

Opencv

创建

img = cv2.imread('img.png')
cv2.imshow('img', img)
img = cv2.imwrite('img_copy.png', img)

Opencv 打开图片之后就是直接以 ndarray 进行存储,因此所有操作与 ndarray 完全相同。同时也可以直接创建 ndarray 对象当做 Opencv 图片处理。因此对于属性,操作和数据转换不再介绍。

需要注意的是,Opencv 在进行图像存储时使用的通道顺序是 BGR,与后面介绍的和通常使用的 RGB 有差异。

PIL Image

创建

from PIL import Image

img = Image.open('img.png')  # 默认为 RGB
img.show()
img.save('img_copy.png')

属性

  • mode:str,图片存储模式,1,L,P,RGB,RGBA,CMYK,YCbCr,I,F
  • format:str,图片存储格式,JPG, PNG, BMP
  • size:tuple,图片的宽高,注意这里是宽在前高在后,和 ndarray(Opencv)刚好相反
  • width, height:int,分别获取宽度和高度
  • palette:仅当 mode 为 P 时有效,返回 ImagePalette 示例

操作

# 转换图片存储模式
img.convert('P')

# 图像裁剪
img.crop((10, 10, 100, 100))  # left, top, right, bottom

# 获取某个点的像素值
img.getpixel((5, 10))  # width 5, height 10
img.putpixel((5, 10), (255, 255, 255))  # if RGB

数据转换

  • ndarray:np.array(),Image.fromarray()

torch Tensor

创建

import torch

t = torch.zeros((5, 5, 5))

# 在制定 GPU 上创建与 data 一样的类型
torch.tensor(data, dtype=torch.float64, device=torch.device('cuda:0'))

属性

  • shape:torch.size,数据对应维度大小;结果等于 size()
  • data:tensor,对应 tensor 数据

操作

gpu_tensor.size()     # 尺寸,tuple 的 size 对象 
gpu_tensor.dim()      # 维度
gpu_tensor.numel()    # 所有元素个数
b = a.clone()         # 数据拷贝

数据转换

  • ndarray:np.array(),torch.from_numpy(),tensor.numpy()
  • list:tensor.tolist()

 

你可能感兴趣的:(Python)