あいどる💖たいむ

あいどるやってます。

OpenCVでモザイク処理

概要

画像全体にモザイク処理をする

環境

実装

import cv2
import numpy as np


def mosaic(img, size=16):
    res = np.empty(img.shape, dtype=np.int16)
    for i in range(0, img.shape[0], size):
        for j in range(0, img.shape[1], size):
            mos_range = img[i:i + size, j:j + size]
            v = mos_range.mean(axis=(0, 1))  # RGB値別の平均を求める
            v = v.astype(np.int16)

            # size * size * 3のリストを作って上書きする
            v_array = [[v] * size] * size
            res[i:i + size, j:j + size] = v_array
    return res


if __name__ == '__main__':
    img = cv2.imread('input.jpg')
    cv2.imwrite('output.jpg', mosaic(img))

sizeで指定したサイズの正方形の範囲別に,RGBそれぞれの平均値を求める.
その範囲を,求めた平均値で埋めている. (画像サイズがsizeで割り切れない場合は,エラーになると思われるので注意)

実行結果

input

f:id:shiccocsan:20170628210026j:plain

output

f:id:shiccocsan:20170628210031j:plain

いらすとやさんの画像をお借りしたが,この画像の需要はどこにあるのか...

考察

ある値でndarrayの指定範囲すべてを更新する方法がわからず,対象範囲と同じ形のリストを作って更新するようにした.
もっと良い方法があるかも...