Numpyを用いて画像生成・複製し、二枚の画像を比較するプログラム
①乱数を用いて画像生成する関数を作る
np.ramdom.randint(m, n,(r,c))で、m以上6未満の数字の行列(r行c列)を作成します。
②上で作成した画像の配列を一部ランダムに変更する関数を作る
shapeを用いて行列(r,c)を取得してshape変数に代入します。
for row .... for col...のパートでは、一行目の一列目、二列目、となめていき最終列までいったら二行目に行くようなプログラムになっています。一つずつスカラー値を取得しているわけですが、その中でif文でランダム(ここでは1/2の確率)でスカラー値を(m,n)の範囲で変更するプログラムを書いています。
変更するプログラムはmatrix[i,j]としている部分ですが、こちらはmatrix[i][j]でも変わりはないようです。
その後のrandint(m,n,l)のlは一つだけ乱数を生成することを指定する引数です。
③ブロードキャストを用いて差分を取得
image1 - image2で行列の同じ位置にある要素同士を差し引き差分を取得します。
あとはnp.abs()で絶対値を取得し出力しております。
import numpy as np
# 乱数の初期化
np.random.seed(0)
# 縦の大きさ、横の大きさを渡されたときに乱数で指定の大きさの画像を生成する関数
def make_image(m, n):
# m×n行列の各成分を0~5の値でランダムに満たす
image = np.random.randint(0,6,(m,n))
return image
# 渡された行列の一部を変更する関数
def change_matrix(matrix):
# 与えられた行列の形を取得し、shapeに代入
shape = matrix.shape
# 行列の各成分について、変更するかしないかをランダムに決めた上で
# 変更する場合は0~5のいずれかの整数にランダムに入れ替える
for row in range(shape[0]):
for col in range(shape[1]):
if np.random.randint(0,2) == 1:
matrix[i,j] = np.random.randint(0,6,1)
return matrix
# ランダムに画像を作成
image1 = make_image(3, 3)
print(image1)
# ランダムに変更を適用する
image2 = change_matrix(np.copy(image1))
print(image2)
# image1とimage2の差分を計算し、image3に代入
image3 = image1 - image2
print(image3)
# image3の各成分が絶対値である行列をもとめimage3に再代入
image3 = np.abs(image3)
# image3を出力
print(image3)