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)

単純に平均値化してのモザイク処理だけど、それらしくなっている。