Pythonによる画像処理100本ノック#8 Maxプーリング


はじめに

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

8本目:Maxプーリング

前回説明したプーリングとは、画像を固定長の領域にグリッド分割し、その領域内の値を全てある値にする処理です。この処理を施すことで画像はモザイク状になります。
Maxプーリングでは領域内の画素値の最大値で領域内を埋めます。
平均プーリングとMaxプーリングの違いは平均値を用いるか最大値を用いるかという点のみです。

ソースコード

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


def maxPooling(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.max(img[x-size:x+size,y-size:y+size,0])
      dst[x-size:x+size,y-size:y+size,1] = np.max(img[x-size:x+size,y-size:y+size,1])
      dst[x-size:x+size,y-size:y+size,2] = np.max(img[x-size:x+size,y-size:y+size,2])

  return dst


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

# Maxプーリング
# 第2引数は領域長
img = maxPooling(img,40)

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

  

画像左は入力画像、画像中央は前回の平均プーリング、画像右は今回の出力画像です。
上手くモザイク状の画像になっていることが分かりますね。また、輝度の高い最大値を使っているだけあって画像全体が平均プーリングよりも明るくなっています。

おわりに

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