文章目录
概括
np.ndarray (H x W x C) 通道:(B、G、R)
PIL Image (H x W x C) 通道:(R、G、B)
OpenCV shape (H x W x C) 通道:(B、G、R)
Tensor shape (C x H x W)
1、OpenCV 图像编码格式
image.shape 得到的图像维度:(B,H,W,C),且通道数是:(B、G、R)
BGR 与 gray 转换公式: g r a y = 0.299 ⋅ r + 0.587 ⋅ g + 0.114 ⋅ b \bm{\mathrm{gray = 0.299\cdot r \quad+\quad 0.587\cdot g \quad+\quad 0.114 \cdot b}} gray=0.299⋅r+0.587⋅g+0.114⋅b
OpenCV加载的彩色图像处于BGR模式,但是Matplotlib以RGB模式显示;因此,如果使用 OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像
采用 img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将通道调换
img = cv2.imread(img_dir)
resized_img = cv2.resize(img, new_size, interpolation=cv2.INTER_LINEAR)
resized_img_rgb = cv2.COLOR_BGR2RGB(resized_img)
resized_img_rgb = cv2.cvtColor(resized_img, cv2.COLOR_BGR2RGB)
imgout = torch.from_numpy(resized_img_rgb).to("cuda").div(255.0).unsqueeze(0)
OpenCV 和 Pillow格式转换
from PIL import Image
import numpy as np
import cv2
img_cv = cv2.imread('image.jpg')
img_pil = Image.fromarray(cv2.cvtColor(img_cv,cv2.COLOR_BGR2RGB)) # opencv转为PIL
img_cv2 = cv2.cvtColor(np.asarray(img_pil),cv2.COLOR_RGB2BGR) # PIL转为OpenCV
img_pil.show()
--------------------------------------------------------------------------------------------
from PIL import Image
import numpy as np
import cv2
img_cv = cv2.imread('image.jpg') # opencv读取图像
img_pil = Image.open('image2.jpg') # PIL读取图像
img_opencv_np = np.array(img_cv) # opencv转为ndarray数组
img_pil_np = np.array(img_pil) # PIL转为ndarray数组
img_pil.show()
cv2.imshow("cv",img_cv)
cv2.waitKey(0)
2、Pillow 图像编码格式
Pytorch中比较常用
- 读取图片是PIL Image格式,需要进一步转换为np.ndarray类型
- image.size得到的是(H,W)
Image.fromarray 将 np.array 转化为 PIL 格式
3、Numpy 图像编码格式
image.shape 得到的图像维度:(H,W,C),且通道数是:(B、G、R)
4、Pytorch 训练编码格式
对于 Pytorch 而言,与图像相关的项目,所有的图像读取都是以 [b、c、h、w]格式进行读取操作
5、torchvision.io.read_image
将JPEG或PNG图像读入三维RGB张量。可选地将图像转换为所需的格式。输出张量的值在0到255之间为uint 8。
torchvision.io.read_image(path: str, mode: torchvision.io.image.ImageReadMode = <ImageReadMode.UNCHANGED: 0>) → torch.Tensor
Parameters
- path (str) –JPEG or PNG 图像地址
- mode (ImageReadMode) – 图像转换的读取模式。默认值:ImageReadMode.UNHANGED。有关各种可用模式的更多信息,请参见ImageReadMode类。
Returns
- output (Tensor[C, H ,W] )
#、torchvison.transforms 数据增强
对数据增强时 图像格式必须是 PIL Image.
transforms.Compose([ transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.RandomRotation(20),
transforms.Resize([self.img_size ,self.img_size]),
transforms.ToTensor(),
transforms.Normalize(mean=[.5], std=[.5] ) ])
-
ToTensor:
将 PIL / np.ndarray 转换为tensor ,但不支持 torchscript。
如果PIL图像属于(L,LA,P,I,F,RGB,YCbCr,RGBA,CMYK,1)模式之一,则将[0,255]范围内的PIL图像或 np.ndarray (np.uint8) (HxWxC)转换为 [0.0,1.0] 范围内的浮点张量 (CxHxW)
在其他情况下,不按比例返回张量 -
transforms.Normalize(mean, std, inplace=False):
用均值和标准差对张量图像进行归一化【但不支持PIL图像】,因此此操作放在 ToTensor之后; m e a n : ( m e a n [ 1 ] , . . . , m e a n [ n ] ) mean: (mean[1],...,mean[n]) mean:(mean[1],...,mean[n]) and std: ( s t d [ 1 ] , . . , s t d [ n ] ) (std[1],..,std[n]) (std[1],..,std[n]) for n n n channels, o u t p u t [ c h a n n e l ] = ( i n p u t [ c h a n n e l ] − m e a n [ c h a n n e l ] ) / s t d [ c h a n n e l ] output[channel] = (input[channel] - mean[channel]) / std[channel] output[channel]=(input[channel]−mean[channel])/std[channel]