图像加载问题
使用pytorch制作图像数据集时,需要将存储在磁盘、硬盘的图像读取到内存中,涉及到图像I/O问题。
在python中,图像处理主要采用的库:skimage, opencv-python, Pillow (PIL)。 这三个库均提供了图像读取的方法。
三种主流图像处理库的比较:
库 | 函数/方法 | 返回值 | 图像像素格式 | 像素值范围 | 图像矩阵表示 |
---|---|---|---|---|---|
skimage | io.imread(xxx) | numpy.ndarray | RGB | [0, 255] | (H X W X C) |
cv2 | cv2.imread(xxx) | numpy.ndarray | BGR | [0, 255] | (H X W X C) |
Pillow(PIL) | Image.open(xxx) | PIL.Image.Image对象 | 根据图像格式,一般为RGB | [0, 255] | — |
读取图像
一张测试图像,彩色,test_liuwen.jpg。(断网了,没安装skimage)
首先先从小数列形象地看一下array、tensor、bgr、rgb的分布。
'''关于列表使用的知识:
'''OpenCV 的cv2.imread()导入图片时是BGR通道顺序,这与Matplotlib的显示,或者读取图片的通道不同,
如果需要可以转换为RGB模式,以下代码显示不同之处,但BGR在许多地方使用,caffe倒入数据是以BGR方式
i,j为正就是序号为j-1,i,j为负就是倒数第-j个
b = a[i:j:s]这,以步进s,从序号为i的到序号为j-1的,缺省为1. 所以a[i:j:1]相当于a[i:j] [1:3].
当s<0时,i缺省时,默认为-1。j缺省时,默认为-len(a)-1
所以a[::-1]相当于 a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序,依次可以达到BGR通道转换为RGB通道。
'''
if __name__ == "__main__":
# 先从小数列形象的看一下
a = [0,1,2,3,4,5,6,7,8]
print(a[1:6:2],a[:2],a[-1:3:-2],a[:3:],a[:3:-1],a[:-3:-1],a[2::1],a[::-1])#
array_t1_bgr = np.array([
[['b1','g1', 'r1'], ["b4", 'g4', 'r4'], ['b7', 'g7', 'r7']],
[['b2','g2', 'r2'], ['b5', 'g4', 'r5'], ['b8', 'g8', 'r8']],
[['b3','g3', 'r3'], ['b6', 'g6', 'r6'], ['b9', 'g9', 'r9']],])
# 转化为 rgb
array_t1_rgb = array_t1_bgr[:,:,::-1]
# 1,2,3各自代表一个通道 看到通道是和输入的array通道是一致的
tensor_t1 = torch.from_numpy(np.array([
[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]],]))
array_t1_tensor = np.array([[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]])
# print(t[:,:-1],'ok\n',t[:,::-1],'ok')#
#