画像処理はじめました。

AI/AR/VRという近未来的な言葉に惹かれ、その技術分野に参戦するために立ち上げたブログです。日々の格闘結果を記録に残してゆこうと思います。

1-7 「モザイク画像処理」

モチベーション

画素に匿名性を持たせることができます。

やり方

PILライブラリを使用し画像を読み込みます。
読み込んだ画像に対してウインドウサイズに応じて処理をおこないます。
ウィンドウサイズが 3x3 の場合、対象9画素の平均値を計算し、元画像へ算出した平均値を代入します。

プログラム

#!/usr/bin/python
# -*- coding: utf-8 -*-

# モザイク処理

from PIL import Image 
import numpy as np
from matplotlib import pylab as plt

# 画像の読み込み
im = np.array(Image.open('input.bmp'))
#print(im.shape, im.dtype)

# 画像の表示
plt.title("before")
plt.imshow(im)
plt.show()


# 画像サイズを取得
Y= im.shape[0]
X = im.shape[1]

# ウィンドウサイズ指定
w = 5

s = np.zeros(3)



##全画素を走査し、ウィンドウサイズ毎にモザイク処理を行う
height=[ i for i in range(int((w-1)/2), Y, w)] 
width=[ i for i in range(int((w-1)/2), X, w)]

for y in height:
    for x in width:
#        print("y:%d x:%d " % (y,x))
#        print(im[y,x]) # 行(height)、列(width)の順

        ## ウィンドウ内の座標指定
        wj = [j for j in range(y-int((w-1)/2), int(y+(w-1)/2)+1)]
        wi = [i for i in range(x-int((w-1)/2), int(x+(w-1)/2)+1)]
        for j in wj:
            for i in wi:
#                print("i:%d j:%d" %(i,j))
#                print(im[j,i])
                s = s + im[j,i]

        # 元画像へモザイク処理した画素値を書き込む
        for j in wj:
            for i in wi:
                im[j,i] = s/(w*w)

        s = np.zeros(3)
            

# 画像の表示
plt.title("after")
plt.imshow(im)
plt.show()

#保存
Image.fromarray(im).save('output.bmp')

実行結果

f:id:genetaka1810:20200119225301p:plain
モザイク処理

解説

画像サイズ10x10、ウィンドウサイズ3x3の場合のモザイク処理について説明します。

f:id:genetaka1810:20200119225759p:plain
モザイク処理3x3入力画像

PILの場合、画像ピクセルは、左上から(0,0), (0,1)…の要素として参照できます。
黄色で示したピクセルが、プログラムの外側のForループで参照される画素座標です。
赤枠はウィンドウサイズを示しています。

ウィンドウ内の座標指定を行っているForループでは、黄色セルを中心に、ウィンドウサイズ(3x3)画素の画素値の合計を算出しています。

元画像へモザイク処理した画素値を書き込む処理は、画素値の合計値の平均値を算出し代入してます。
この処理を以下に図示しておきます。

f:id:genetaka1810:20200119231458p:plain
モザイク処理 平均値の算出と代入