举例分析
假如用分辨率为98*148的树形图片

当我们用opencv读取该图片时,返回的图片的shape是(148, 98, 3)

import cv2
 img = cv2.imread(img_path)
 print(img.shape)(148, 98, 3)


由此可见图片的返回的图片的shape的格式是(h,w,c)

148表示有148行,可以表达为图片的高 height
98表示图片有98列,可以表达为图片的宽 width
c表示 图片的通道数,彩色图片是三通道的,每个通道表示图片的一种颜色(RGB),对于OpenCV读取到的图片的通道顺序是BGR

不同的读取图像的工具,读取到的图像的通道的颜色顺序是不一样的

opencv读进来的图片已经是一个numpy矩阵了,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8;
opencV读取的格式:BGR (opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记!)
opencV存储的格式:BGR
PIL的读取和存储格式是RGB
PIL读进来的图像是一个对象,而不是我们所熟知的numpy 矩阵
针对PIL读进来的图像是一个对象,那么如何才能将读进来的图片转为矩阵呢,方法如下:

from PIL import Image
 import numpy as np
 img1 = Image.open(‘d:/picture/cat.jpg’)
 arr = np.array(img1)


在深度学习的时候,推理的前处理,一般都是将RGB或BGR图像进行转变为CHW的格式

PIL和Skimage读取图像是HWC格式,- opencv读取图像是也是HWC的格式
CHW更适合CNN:因为网络是一个通道一个通道的对图像做卷积,提取feature,希望在访问同一个channel的像素是连续的,一般存储选用CHW,这样在做CNN的时候,在访问内存的时候就是连续的了,比较方便;
yolov5读取图片处理
yolov5在读取图片事,代码如下

img = cv2.imread(path)
 img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB


代码中的“ ::-1”是将BGR转换成RGB,代码中的transpose(2, 0, 1) 是将HWC转换成CHW格式