Pythonで画像処理 〜2枚の画像を重ねてみる〜
pythonのライブラリ、pillowを使って、2つの画像を重ねてみたいと思います。
重ねる画像はこの2つ。
アナログテレビ時代のザザーッって感じのやつ。
微妙にこの2つの画像、違います。
これを重ねてみます。
以下が重ねるコードです。
画像のピクセルを配列に入れる関数と画像を重ねる関数の2つを使って、画像を重ねています。
コードと一緒に、コードの動きをコメントで書いています。
#pillowとnumpyをインストール from PIL import Image import numpy as np #画像のピクセルを配列に入れる関数 def pixelGetter(img): #画像を開く img = Image.open(img) #画像のサイズ(縦×横)を入れる #今回使用する画像は640×480 size = img.size #print(size[0]) #print(size[1]) #配列を入れる変数を定義 img_pixels = [] for x in range(size[0]): for y in range(size[1]): #画像の左上から順番にピクセルの情報を取得 #1ピクセルの情報は(r, g, b, 透過度) #この情報をappendで配列に入れている img_pixels.append(img.getpixel((x,y))) #ピクセル情報が入っている配列をリターン return img_pixels #画像を重ねる関数 def pileUp(pic1, pic2): #2枚の画像を開く img = Image.open("pic1.png") img2 = Image.open("pic2.png") #2枚の画像のサイズを入れる size = img.size size2 = img2.size #2枚の画像を重ねるための変数を定義 #重ねるといっても、実際は2枚の画像から新しい3枚目の画像を作成している #そのため、3枚目の画像を入れる変数をここで定義する必要がある #サイズは2枚の画像と一緒であるため、640×480を入れる new_img = Image.new("RGBA", size) #重ねる処理を行う #画像を重ねるというのは、中の処理は1つ1つのピクセル同士を足し合わせるということ #赤い透明の下敷きを2枚重ねると、濃い赤になる原理と同じ #そのため、2枚の同じ位置同士のピクセルの(r, g, b)を足し合わせている i = 0 for x in range(size[0]): for y in range(size[1]): r = pic1[i][0] + pic2[i][0] g = pic1[i][1] + pic2[i][1] b = pic1[i][2] + pic2[i][2] #ピクセル情報の入った配列では、画像を表示する形式に合わない #そのため、putpixelで画像表示の形式に変換 new_img.putpixel((x, y), (r, g, b, 255)) i += 1 #リターンで重ねた画像を表示 return new_img.show() pic1 = pixelGetter("pic1.png") pic2 = pixelGetter("pic2.png") pileUp(pic1, pic2)
結果的に、重ねると...
重ねるとちょっとした文字がでてきましたね。(出てきた文字に特に意味はありません)