ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

Pythonで画像処理 〜2枚の画像を重ねてみる〜

pythonのライブラリ、pillowを使って、2つの画像を重ねてみたいと思います。

重ねる画像はこの2つ。

アナログテレビ時代のザザーッって感じのやつ。

微妙にこの2つの画像、違います。

これを重ねてみます。

f:id:doz13189:20170723012946p:plain

f:id:doz13189:20170723013003p:plain


以下が重ねるコードです。

画像のピクセルを配列に入れる関数と画像を重ねる関数の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)

結果的に、重ねると...

f:id:doz13189:20170723013216p:plain

重ねるとちょっとした文字がでてきましたね。(出てきた文字に特に意味はありません)

まとめ

pythonって色々なことができるんだなぁと実感しました。

たまにいつもと違うコードを書くのも楽しいですね。

以上終わり。