基本属性
首先,了解一点numpy数组基本属性。
属性 | 含义 |
---|---|
narray.ndim | 秩,维数,一维数组的秩为1,二维数组的秩为2 |
narray.shape | 维度表示,行数、列数等 |
narray.size | 元素总个数, 等于shape属性中元组元素的乘积 |
narray.dtype | 元素类型 |
transpose 与 reshape
import numpy as np
# 一维数组transpose无意义
data = np.arange(4)
print(data)
data = data.transpose()
print(data)
# 二维数组,横纵坐标互换
data = np.arange(8).reshape(4, 2)
print(data)
data = data.transpose()
print(data)
# 三维数组,可以理解为2个 3行 * 4列的二维数组
data = np.arange(24).reshape(2, 3, 4)
print(data)
# transpose其实接受参数,不过对于一二维数组没有必要
# 参数可以是0,1,2,可以想象成对应x,y,z坐标
data = data.transpose(2, 1, 0)
print(data)
一二维数组没有什么好说,三维数组的transpose找对应关系稍微复杂,不过相比于寻找具体的对应关系,我觉得更好理解的是:
- 第0个维度:对应有多少个二维数组
- 第1个维度:对应每个二维数组的行数
- 第2个维度:对应每个二维数组的列数
举个简单例子:
img = Image.open(r"G:\tmp\wbc.jpg")
img_arr = np.array(img).astype(np.uint8)
print(img_arr.shape)
print(img_arr)
img_arr = img_arr.transpose(2, 0, 1)
print(img_arr.shape)
print(img_arr)
一个540 * 720的图片,通过numpy转为数组的shape是(720,540,3),相当于720个540行3列的数组,参数对应关系:
- 第0个维度:720
- 第1个维度:540
- 第2个维度:3
我们可以通过transpose(2, 0, 1),把数组变为第二个参数变为第0个参数,第0个参数变为第一个,第一个参数变为第二个,于是:
- 第0个维度:3
- 第1个维度:720
- 第2个维度:540
这样数组的shape就变为(3,720,540),相当于3个720行,540列的二维数组,这样我们就成功的将RGB分离出来,方便进一步计算。
应用
白平衡中的灰度世界算法:
import numpy as np
from PIL import Image
def gray_world(src_img_path, dest_img_path):
"""
灰度世界算法
"""
src_img = Image.open(src_img_path)
# 图形转numpy数组
image_arr = np.array(src_img).astype(np.uint32)
# 分离RGB
image_arr = image_arr.transpose(2, 0, 1)
avg_red = np.average(image_arr[0])
avg_green = np.average(image_arr[1])
avg_blue = np.average(image_arr[2])
gray = (avg_red + avg_green + avg_blue) / 3
kred = gray / avg_red
kgreen = gray / avg_green
kblue = gray / avg_blue
image_arr[0] = np.minimum(image_arr[0] * kred, 255)
image_arr[1] = np.minimum(image_arr[1] * kgreen, 255)
image_arr[2] = np.minimum(image_arr[2] * kblue, 255)
# 重新合并RGB
image_arr = image_arr.transpose(1, 2, 0)
# numpy数组转图像
img = Image.fromarray(image_arr.astype('uint8')).convert('RGB')
img.save(dest_img_path)
if __name__ == '__main__':
img_path = r"G:\tmp\2d.jpg";
gray_world(img_path, r"G:\tmp\gray_world.jpg")