Pillowでモザイク処理(白黒)
■Python の Pillowパッケージを使ったJPG画像のモザイク処理
前に Pillow を使っていたときに crop で画像の切り取りデータが扱えたので、その中で色データを平均値化すればモザイク処理ができる、とふと思ったので、試してみたもの。
つなぎ合わせは paste で以下のように行う。
from PIL import Image
newimg01 = Image.new("L", [40, 40], 255)
newimg02 = Image.new("L", [40, 40], 100)
newimg03 = Image.new("L", [40, 80], 0)
newimg01.show()
newimg02.show()
newimg03.paste(newimg01, (0, 0))
newimg03.paste(newimg02, (0, newimg01.height))
newimg03.show()
ここで、Image.new("L", [40, 40], 255) は、Lで白黒のモード、横40ピクセル、縦40ピクセル、白(色255)として画像データを作成。同じように灰色(色100)のものを作成し、それらを newimg03 に張り付け。
モザイク処理のコードサンプルが下のもの。
from PIL import Image
img = Image.open('sample044.JPG')
img.show()
img = img.convert("L")
img.show()
xsize, ysize = img.size
resultImg = Image.new("L", [xsize, ysize], 0)
sideval = 2
for i in range(0, int(xsize / sideval)):
for j in range(0, int(ysize / sideval)):
part = img.crop(((i * sideval), (j * sideval), (i * sideval + sideval), (j * sideval + sideval)))
info = part.getcolors()
sumNum = 0
sumColinfo = 0
for pixelCol in info:
sumNum = sumNum + pixelCol[0]
sumColinfo = sumColinfo + (pixelCol[1]*pixelCol[0])
result = int(sumColinfo / sumNum )
imgsect = Image.new("L", [sideval, sideval], result)
resultImg.paste(imgsect, (i * sideval, j * sideval))
resultImg.show()
ここで、sideval でモザイクとする一辺を指定。上のコードでは2ピクセル。白黒にすると getcolors で得られたデータが [ピクセル数, 色データ] となるため、pixelCol[0] でピクセル数を取得、pixelCol[1] で色データを取得している。
sample044.JPG としてサンプル画像を同じフォルダに用意して、sideval の値を変えながら実行してみる。
結果が下のもの。
サンプル1(鯉2匹:360×200ピクセル)
白黒へ変換
モザイク処理(sideval:4)
モザイク処理(sideval:20)
サンプル2(遠景:360×200ピクセル)
白黒へ変換
モザイク処理(sideval:4)
モザイク処理(sideval:20)
単純に平均値化してのモザイク処理だけど、それらしくなっている。