Pythonによる画像処理100本ノック#7 平均プーリング


はじめに

どうも、らむです。
今回は画像をグリッド分割する手法であるプーリング処理の中でも、領域中の平均値を代表値とする平均プーリングについき実装します。

7本目:平均プーリング

プーリングとは画像を固定長の領域にグリッド分割し、その領域内の値を全てある値にする処理です。この処理を施すことで画像はモザイク状になります。
平均プーリングでは領域内の画素値の平均値で領域内を埋めます。

平均プーリングは以下の式によって定義されます。
Rは領域のことで、例えば8×8ピクセルの領域であれば$|R|=8×8=64$になります。

v = \frac{1}{|R|}\sum_{i \in R}v_i

ソースコード

avePooling.py
import numpy as np
import cv2
import matplotlib.pyplot as plt


def avePooling(img,k):
  dst = img.copy()

  w,h,c = img.shape
  # 中心画素から両端画素までの長さ
  size = k // 2

  for x in range(size, w, k):
    for y in range(size, h, k):
      dst[x-size:x+size,y-size:y+size,0] = np.mean(img[x-size:x+size,y-size:y+size,0])
      dst[x-size:x+size,y-size:y+size,1] = np.mean(img[x-size:x+size,y-size:y+size,1])
      dst[x-size:x+size,y-size:y+size,2] = np.mean(img[x-size:x+size,y-size:y+size,2])

  return dst


# 画像読込
img = cv2.imread('image.jpg')

# 平均プーリング
# kは領域サイズ
img = avePooling(img,40)

# 画像保存
cv2.imwrite('result.jpg', img)
# 画像表示
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

 

画像左は入力画像、画像右は出力画像です。
上手くモザイク状の画像になっていることが分かりますね。グロそうなものに見えてしまいますが、ちゃんとお刺身です。

画像処理でよく使われるLenaさんの画像のフルバージョンも平均プーリング処理をかければQiitaにも載せることができますね。

おわりに

もし、質問がある方がいらっしゃれば気軽にどうぞ。
imori_imoriさんのGithubに公式の解答が載っているので是非そちらも確認してみてください。
それから、pythonは初心者なので間違っているところがあっても優しく指摘してあげてください。