numpy配列の転置と画像

基本的な属性

最初に、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次元配列の転置は、対応を見つけるのが少し複雑ですが、特定の対応を見つけるのに比べて、理解する方がよいと思います。

  1. 第0次元:2次元配列の数
  2. 最初の次元:各2次元配列に対応する行の数
  3. 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配列に相当します。パラメーター間の対応する関係:

  1. 0次元:720
  2. 最初の次元:540
  3. 2番目の次元:3

形状

transpose(2、0、1)を使用して、配列を2番目のパラメーターから0番目のパラメーターに、0番目のパラメーターを最初のパラメーターに、最初のパラメーターを2番目のパラメーターに変更できます。

  1. 0次元:3
  2. 最初の次元:720
  3. 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")

おすすめ

転載: blog.csdn.net/trayvontang/article/details/108391139
おすすめ