由图像的像素数量和分配决定:如 300X400 的一张图像,高度为 300 像素,宽度为 400 像
素,总像素数量 120,000
存储每个像素所用的位数,也用于量度图像的色彩分辨率。比如一幅单色图像,若每个像素
有 8 位,则最大灰度数为 2 的 8 次方即 256(从纯黑到纯白分为 255 阶),总共能表示 256
种颜色。
假设一幅彩色图像RGB3个分量的像素位数分别为8,8,8,则最大颜色数目为2的3X8次方,
即 16777216,就是说像素的深度为 24 位,每个像素可以是 16777216 种颜色中的一种。
通过图像的宽度、高度、深度,能够求出图像的大小为:
图 像 大 小 ( B y t e ) = h e i g h t × w i d t h × d e p t h 8 图像大小(Byte)=\frac{height \times width \times depth}{8} 图像大小(Byte)=8height×width×depth
(如一张 100×100,深度为 16 位的图像,其大小为 20,000 Byte,约等于 19.5KB)
注意位到字节的转换,8 bit = 1 Byte
灰度图(GRAY)的通道数为 1,大多数彩色图像(如 HSV,BGR)的通道数为 3,小部分彩色
图像的通道数为 4(如 CMYK)
以下是需要用到的模块,没有安装的话
sudo pip install numpy
sudo pip install opencv-python
import numpy as np
import cv2
利用 numpy 模块来产生数组,利用 cv2 将数组转换成图像
建立一个二维数组,大小 3x3,赋值为 0
img = np.zeros((3,3),dtype=np.uint8)
print(img)
此时的打印结果如下:
[[0 0 0]
[0 0 0]
[0 0 0]]
img 数组中储存的是九个像素的值,这些值均为 0,若将其保存为图像,则将显示黑色。
之后进行如下操作:
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
同样,通过 print 函数输出,输出得:
[[[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]]]
可以看到,数组中多出了两个通道,从上到下依次为 B 通道,G 通道和 R 通道的值。如果保
存这张图片,他们的颜色同样会是黑色。
可以编写如下代码:
import numpy as np
import cv2
import os
random = bytearray(os.urandom(900))
flat = np.array(random)
gray = flat.reshape(30,30)
cv2.imshow("gray",gray)
bgr = flat.reshape(10,30,3)
cv2.imshow("bgr",bgr)
这段代码先生成了九百个随机字节,之后利用 shape 和 reshape 来对图像的大小进行限制。
(注意:形状的总大小要与字节数一致,字节数 = 宽度 X 高度 X 通道数)