主要应用np.transpose()这个函数对图像通道转换
在神经网络中图片通常处理的格式为[c,rgb,w,h][c,rgb,w,h][c,rgb,w,h]或者就是[rgb,w,h][rgb,w,h][rgb,w,h]
c: channel
rgb: 彩色即为3,黑白即为1
w: width
h:hight
我们用cv2.imread()所读入的图片,是按照numpy.ndarry的数据格式,读入一个三维的矩阵[w,h,rgb]
所以我们需要一个转换的过程
先cv2.imread()一个图片
Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> data = cv2.imread('imgs/01.jpg')
>>> data.shape
(681, 1018, 3)
>>>
我们读入了图片01.jpg,并打印出shape,当然也可以把整个矩阵打印出来看下
>>> data
array([[[226, 155, 92],
[226, 155, 92],
[226, 155, 92],
...,
[227, 155, 95],
[229, 157, 97],
[230, 159, 96]],
[[225, 154, 91],
[227, 156, 93],
[228, 157, 94],
...,
[228, 156, 96],
[228, 157, 94],
[228, 157, 94]],
[[225, 157, 92],
[228, 157, 94],
[228, 157, 94],
...,
[229, 156, 96],
[229, 158, 95],
[229, 158, 95]],
...,
[[233, 167, 108],
[233, 168, 107],
[231, 170, 104],
...,
[234, 170, 106],
[233, 169, 105],
[233, 166, 103]],
[[229, 163, 104],
[232, 167, 106],
[233, 169, 104],
...,
[235, 170, 109],
[234, 167, 106],
[231, 164, 101]],
[[232, 164, 105],
[234, 167, 106],
[234, 168, 103],
...,
[237, 170, 109],
[233, 168, 107],
[230, 165, 104]]], dtype=uint8)
>>>
可以发现cv2读入的图片都是按照每个像素点的rgb为单位保存起来,也就是[w,h,rgb]
好了重点来了,到这里介绍下相互转换的方法:
[w,h,rgb]→[rgb,w,h][w,h,rgb] \rightarrow [rgb,w,h][w,h,rgb]→[rgb,w,h]: np.transpose(data,(2,0,1)) [rgb,w,h]→[w,h,rgb][rgb,w,h] \rightarrow [w,h,rgb][rgb,w,h]→[w,h,rgb]: np.transpose(data,(1,2,0))没错就是这么简单。。
我们可以简单试验下:
>>> import numpy as np
>>> data.shape
(681, 1018, 3)
>>> data0 = np.transpose(data,(2,0,1))
>>> data0.shape
(3, 681, 1018)
>>>
将神经网络处理的图像通道格式转换为cv2的格式以便imshow()或者imwrite()的格式>>> data0.shape
(3, 681, 1018)
>>> data1 = np.transpose(data0,(1,2,0))
>>> data1.shape
(681, 1018, 3)