基本的な属性
最初に、numpy配列の基本的なプロパティを理解します。
の属性 | 意味 |
---|---|
narray.ndim | ランク、次元、1次元配列のランクは1、2次元配列のランクは2 |
narray.shape | 次元、行数、列数など |
narray.size | 要素の総数。shape属性のタプル要素の積に等しい |
narray.dtype | 要素タイプ |
転置と変形
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)
1次元配列と2次元配列については言うまでもありません。3次元配列の転置は、対応を見つけるのが少し複雑ですが、特定の対応を見つけるのに比べて、理解する方がよいと思います。
- 第0次元:2次元配列の数
- 最初の次元:各2次元配列に対応する行の数
- 2番目の次元:各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によって変換された配列の形状は(720,540,3)で、これは540行と3列の720配列に相当します。パラメーター間の対応する関係:
- 0次元:720
- 最初の次元:540
- 2番目の次元:3
transpose(2、0、1)を使用して、配列を2番目のパラメーターから0番目のパラメーターに、0番目のパラメーターを最初のパラメーターに、最初のパラメーターを2番目のパラメーターに変更できます。
- 0次元:3
- 最初の次元:720
- 2番目の次元:540
このようにして、配列の形状は(3,720,540)になり、これは720行540列の3つの2次元配列と同等であるため、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")