python图像三维数组理解

原文网址:https://zhuanlan.zhihu.com/p/497136322

今天在学opencv时,读取完一张彩色图像后,打印了这张图像,结果出来一个三维数组,很懵。

下面结合图像的基本知识加上三维数组及切片对其进行理解

 

  • 首先,我们知道彩色图像是由RGB三个通道组成。而这恰恰是为什么是三维数组的关键

 

  • 在理解三维数组之前,我们先了解一下二维数组及其切片的用法。

我们知道python中一维列表(列表中元素全为数字时就是数组)中每个元素是单个的数字或者字符串。结合一维列表就不难理解,二维列表中每个元素是一个一维的列表。

如:a=[[1,2,3],[4,5,6],[7,8,9]]就是一个二维数组,外层数组中的每个元素都是一个数组。

理解了二维数组的定义,我们再来看看二维数组切片的用法(一维数组的切片这里就不细说了),

import numpy as np #这个库用于随机生成和矩阵运算
a=[[1,2,3],[4,5,6],[7,8,9]]#生成一个二维列表
b=np.array(a)#将二维列表转换成二维数组
print(b[1,1])

b[1,1]是指序号为1的数组中的第一个元素

运行结果:

import numpy as np #这个库用于随机生成和矩阵运算
a=[[1,2,3],[4,5,6],[7,8,9]]#生成一个二维列表
b=np.array(a)#将二维列表转换成二维数组
print(b[:,1])
print(b[1,:])

b[:,1]的意思是这一行所有数组的第一个元素(b[x,y]表示x行中的数组中的第y个元素,那么:代表所有的意思)

b[1,:]表示序号为1的数组的所有元素

运行结果:

 

  • 大致了解了二维数组的切片,我们再来聊聊图像三维数组。

一张图片的颜色是由RGB三个通道构成, 可以把一张图片上的每一个像素点看成一个对象, 这个对象又由RGB三种颜色叠加, 即用一个一维数组表示,假如我们有一张 m * n 个像素点的图片, 那么每一行有 n 个像素, 即每一行有 n 个一维数组, 即这一行是一个二维数组, 那一张图片又有 m 行, 那么我们就得到了 m 个二维数组, 这m 个二维数组构成了一个三维数组。(即每个最内层的数组有三个元素,代表着RGB三个通道的灰度值。第二层和第三层则负责遍历整个行和列)

那么现在让我们回到最开始的问题,打印图像后出来的三维数组:

import cv2#cv2是BGR而不是RGB
import numpy as np #这个库用于随机生成和矩阵运算
img = cv2.imdecode(np.fromfile('狗.jfif', dtype=np.uint8),-1) #用这个函数代替cv2.imread函数能使用含中文的文件名
print(img)#彩色图像RGB,所以是三维

输出结果:[[[ 29 27 19]

[ 37 34 29]

[ 29 27 26]

...

[ 34 37 28]

[ 33 36 27]

[ 33 36 27]]

 

[[ 37 34 29]

[ 40 37 32]

[ 32 30 29]

...

[ 33 36 27]

[ 34 37 28]

[ 35 38 29]]

 

[[ 37 34 30]

[ 37 34 30]

[ 38 34 33]

...

[ 30 33 24]

[ 31 34 25]

[ 32 35 26]]

 

...

 

[[ 19 51 40]

[ 17 49 38]

[ 21 53 42]

...

[ 95 109 127]

[ 94 107 123]

[ 95 107 125]]

 

[[ 21 52 43]

[ 20 51 42]

[ 20 51 42]

...

[ 94 109 125]

[ 93 106 120]

[ 94 107 123]]

 

[[ 28 59 50]

[ 27 58 49]

[ 20 51 42]

...

[ 90 105 121]

[ 88 101 115]

[ 87 100 114]]]

结合上面对图像三维数组的理解就不难理解这个三维数组了。

  • 下面让我们对三维数组进行切片来完成分离图片的RGB三个通道。

原图:

分离RGB:

import cv2#cv2是BGR而不是RGB
import numpy as np #这个库用于随机生成和矩阵运算
img = cv2.imdecode(np.fromfile('狗.jfif', dtype=np.uint8),-1) #用这个函数代替cv2.imread函数能使用含中文的文件名
img[:,:,0]=0#使B通道所有灰度值为0
img[:,:,1]=0#使G通道所有灰度值为0
cv2.imshow("img",img)
cv2.waitKey(0)

img[:,:,0]表示每行每列的最内层数组的序号为0的元素

结果:

可见将B和G通道灰度值置零后只剩下R通道,图片也就变红了。分离B和G通道也是同理。

参考文献:
(2条消息) python 二维数组切片_python中数组切片含义解析_蒋四金法考的博客-CSDN博客
(2条消息) python图像三维数组通透理解_贰の⑩次方的博客-CSDN博客_python三维数组怎么理解
(2条消息) python三维数组切片_十铭忘的博客-CSDN博客_python三维数组切片
编辑于 2022-07-07 22:25
posted @   MaxBruce  阅读(898)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-07-20 lwm2m协议
2021-07-20 WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式
点击右上角即可分享
微信分享提示