OpenCVで画像にモザイクかけてみた

はじめに

こんにちは,光岡です.

久しぶりの投稿になってしまいました. 最近はレコメンドシステムの勉強をやっている関係でPythonに触れています.講義の課題に対して,Pythonで何か作れないかな~と思っていたところ,OpenCVが使えそう!となり,簡単なモザイク処理を試してみたので,この内容について書いてみたいと思います!

OpenCVとは

OpenCVとは,画像・動画に関する処理機能をまとめたオープンソースのライブラリになります. Intelが開発したOSSで,画像・動画の中に存在する物体の位置情報・パターン・動きをプログラムで識別することが可能です.

モザイクのかけ方

モザイクをかける手順としては,まずモザイク処理をしたい領域を一度小さいサイズに縮小します.今回は画像全体に対してモザイクをかけたかったので,画像全体を縮小します.縮小する際は,cv2.resize()を利用しました.
縮小する際には,最近傍補間が行われます.不要な画素を削る間引き処理を行うことで,見た目が粗い状態になります.

次に縮小した画像を元のサイズに拡大することで,モザイクがかかった粗い状態で出力することができます.拡大する際にもcv2.resize()を利用します.

実装

今回の実装では,O-DANで検索して見つけた画像をダウンロードして利用しました.

import cv2

def mosaic(img, ratio=0.1):
  h, w = img.shape[:2]
  reduced_img = cv2.resize(
    img,
    dsize=None,
    fx=ratio,
    fy=ratio,
    interpolation=cv2.INTER_NEAREST,
  )
  enlarged_img = cv2.resize(
    reduced_img,
    dsize=(w, h),
    interpolation=cv2.INTER_NEAREST,
  )
  return enlarged_img

img = cv2.imread('./shibuya.jpg')

ratio = float(input())
mosaic_img = mosaic(img, ratio=ratio)
cv2.imwrite("./shibuya_{}.jpg".format(ratio), mosaic_img)

結果

モザイク度合いを標準入力できるようにし,いくつかモザイク処理を施した画像を出力してみました.

  • 元画像

  • 0.01

  • 0.005

  • 0.001

まとめ

ライブラリを使うことで簡単に実装することができました! 現状,講義の課題で少し使うぐらいしか予定がありませんが,今後機械学習の勉強を進めていく際にOpenCVも使っていきたいと思いました.
以上になります.最後まで読んでいただきありがとうございました.

参考記事

【OpenCV】できることや特徴をわかりやすく解説 | 侍エンジニアブログ

OpenCV - 画像にモザイク処理を行う方法について - pystyle

C言語で画像の拡大縮小(最近傍補間編) | だえうホームページ

画像の拡大縮小・リサイズの原理、アルゴリズムによる違いを解説! | だえうホームページ

Python, OpenCVで画像にモザイク処理(全面、一部、顔など) | note.nkmk.me