图像通道转换----CNN卷积网络中的图像(rgb,w,h)与cv2读入的图像(w,h,rgb)之间转换

Cherise ·
更新时间:2024-11-15
· 626 次阅读

主要应用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))

没错就是这么简单。。
我们可以简单试验下:

将cv2读入的图片转为神经网络处理的图像通道格式 >>> import numpy as np >>> data.shape (681, 1018, 3) >>> data0 = np.transpose(data,(2,0,1)) >>> data0.shape (3, 681, 1018) >>> 将神经网络处理的图像通道格式转换为cv2的格式以便imshow()或者imwrite()的格式
(这里需要视情况注意选择channel的问题) >>> data0.shape (3, 681, 1018) >>> data1 = np.transpose(data0,(1,2,0)) >>> data1.shape (681, 1018, 3)
作者:liuuul



cnn 图像通道 rgb

需要 登录 后方可回复, 如果你还没有账号请 注册新账号