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三维数组切片
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-07-20 lwm2m协议
2021-07-20 WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式