pythonのOpenCVでモザイクをかける

昨日の記事ではpillowに頼ってしまったけれど、リベンジにOpenCVだけで画像にモザイクをかけてみました。 さっき書いた画像の貼り付けと組み合わせれば部分的なモザイクも可能なはず。

import cv2

img = cv2.imread('laughingman.png')

# オリジナルのサイズを保存しておく。
#  shapeで取得できるサイズとresizeの引数に渡すサイズでは横縦の順番が違うらしい。ので[::-1]として反転。
origsize = img.shape[:2][::-1]

img = cv2.resize(img, (origsize[0]//20, origsize[1]//20))  # 画像を20分の1のサイズに縮小。

img = cv2.resize(img, origsize, interpolation=False)  # 画像を元のサイズに拡大。interpolationを省略するとうまいこと補完されてしまって綺麗なモザイクにならない。

cv2.imwrite('output.jpg', img)

こんな感じで。 結構簡単にできた。pillow使わなくても十分だね。

実行結果はこんなん。

モザイクかける前のレナさん モザイクかけた後のレナさん

2020-06-19 追記

最新の環境(Python 3.8 / OpenCV 4.2)でも動くようにプログラムを更新しました。