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')