見出し画像

NumPyで画像を比較するプログラム

機械学習では膨大なデータ(画像など)を学習するために膨大な計算が短時間で行われる。そこで、Numpy を使って 画像 (ランダムに作成した2次元配列) の差分を計算してみる練習をしてみた。

以下が大まかな流れ。

1) np.random.randint()を用いてランダムに2次元配列を作成する関数を作る
2) 渡された2次元配列の一部をランダムに変更する関数を作る
3) 上記1) と 2) を比較する

実装

import numpy as np

▼乱数を固定する場合は以下をコメントアウト
#np.random.seed(0)

▼縦の大きさ、横の大きさを渡されたときに乱数で指定の大きさの画像を生成する関数

def make_image(m,n):
    image = np.random.randint(0,9,(m, n))
    return image

▼渡された行列のいち部を変更する関数

def change_image(matrix):
    ▼ 与えられた行列の形を取得し、shapeに代入
    shape = matrix.shape
    
    ▼ 行列の各成分について、変更するかしないかを一つずつランダムに判断
    for i in range(shape[0]):
        for j in range(shape[1]):
            if np.random.randint(0,2) == 1:
                #print("randint = 1")
                ▼ 変更する場合は、08のいずれかの整数にランダムに変更
                matrix[i][j] = np.random.randint(0,9,1)
    
    return matrix    

▼ランダムに画像を作成
image1 = make_image(5,5)
print("ランダムに画像を作成")
print(image1)
print()
#print(image1[2][2]) #行列の各成分の出力

▼ランダムに変更を適用
image2 = change_image(np.copy(image1))
print("変更された画像")
print(image2)
print()

▼image1とimage2の差分を計算して image3を作成
image3 = image2 - image1
print("オリジナル画像と変更後の画像の差分")
print(image3)
print()

▼image3の各成分を絶対値で出力
print("差分を絶対値で出力")
image3 = np.abs(image3)
print(image3)

実行結果

ランダムに画像を作成
[[4 3 5 6 3]
 [2 8 1 4 0]
 [8 3 5 5 1]
 [7 8 6 4 7]
 [3 5 3 6 4]]

変更された画像
[[3 0 3 5 8]
 [0 8 6 3 0]
 [7 3 0 6 2]
 [4 1 2 4 7]
 [3 4 2 7 4]]

オリジナル画像と変更後の画像の差分
[[-1 -3 -2 -1  5]
 [-2  0  5 -1  0]
 [-1  0 -5  1  1]
 [-3 -7 -4  0  0]
 [ 0 -1 -1  1  0]]

差分を絶対値で出力
[[1 3 2 1 5]
 [2 0 5 1 0]
 [1 0 5 1 1]
 [3 7 4 0 0]
 [0 1 1 1 0]]


NumPyは一旦ここで学習終了。
次回からは Pythonを使ったデータ解析に便利な機能を提供しているライブラリ「 Pandas」 をやっていく予定。

今回の"note"を気に入って頂けましたら、是非サポートをお願いいたします!