Pythonで、人の顔にモザイク処理をしてみたいです・・・
OpenCVライブラリを使えば、簡単にできるぞ。
✔️ 本記事のテーマ
Pythonで画像にモザイク処理を行う方法
✔️ 読者さんへの前置きメッセージ
本記事は「Pythonでモザイク処理を行う方法」について書いています。
この記事を読むことで
「OpenCVライブラリの使い方 と モザイク処理を行うコードの書き方」
をイメージできるようになります。
OpenCV は、画像処理に関する機能をまとめたライブラリです。
今では「画像処理」を用いたPythonプログラミングでは
必ずと言っていいほど使用されるほどに、メジャーなライブラリです。
参考記事:「【python】OpenCVの関数一覧と使い方」
OpenCVを使うことで、
人の顔を検出して、その部分にモザイク処理を行うプログラムを書くことができます。
OpenCVライブラリを使った、
モザイク処理を行うコードの書き方を解説していきましょう。
OpenCVライブラリを使って、モザイク処理をするとは?
OpenCVを使うと、以下の画像のようなことができます。
何をしているかと説明すると、
- 画像中から「顔らしい部分」を検出する
- 「顔らしい部分」に対してモザイク処理を行う
ということをしています。
OpenCVを使うことで、これらのことを、簡単に行うことができます。
では、どのように実装するのか、コードと合わせて解説していきます。
OpenCVライブラリを使って、モザイク処理をする(コード解説)
OpenCVライブラリはサードパーティ製のPythonライブラリです。
そのため、インストールしないとPythonから使うことができません。
OpenCVライブラリをPythonから使うときは必ずインストール作業を始めにしましょう。
なお、OpenCVのインストール方法の詳細は、
「【python】OpenCVのインストール方法」の記事で書いています。
次から、OpenCVを使ったモザイク処理をコードベースで解説していきます。
コード全体像(OpenCVを使ったモザイク処理)
OpenCVライブラリを使って、モザイク処理を行うコードは以下の通りです。
import cv2
def pixelate(src, ratio=0.1):
small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)
def pixelate_area(src, x, y, width, height, ratio=0.1):
dst = src.copy()
dst[y:y + height, x:x + width] = pixelate(dst[y:y + height, x:x + width], ratio)
return dst
def submit_cv():
src = cv2.imread(IMG_PATH)
face_cascade_path = BASE_DIR + 'haarcascade_frontalface_default.xml'
face_cascade = cv2.CascadeClassifier(face_cascade_path)
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(src_gray)
for x, y, w, h in faces:
dst_face = pixelate_area(src, x, y, w, h)
if len(faces) > 0:
cv2.imwrite(OUT_PATH, dst_face)
else:
cv2.imwrite(OUT_PATH)
部分的に詳しく解説していきましょう。
def pixelate(モザイク処理の定義)
この関数では、モザイク処理を定義しています。
処理の詳細としては、cv2.resize関数を使ってモザイク処理を実現しています。
cv2.resize関数は、画像のリサイズを実施する関数です。
この関数を使って、
「画像を縮小した後に、元のサイズに拡大する」
ということを行なっています。
文字にすると、無意味なことをやっているようですが、ちゃんと意味があります。
画像サイズを一度縮小した後に、拡大するとピクセルが引き伸ばされてぼやけたようになります。これにより、モザイク加工をしたような画像になります。
ちなみにこの関数は、
インプットが対象の画像、アウトプットがモザイク加工後の画像になっています。
def pixelate_area(モザイク処理の実施)
この関数では、範囲を指定してモザイク処理を実施しています。
x座標、y座標、幅、高さによって範囲を指定することで、
そのエリアに対してモザイク処理を行います。
モザイク処理自体は、先述のpixelate関数を呼び出すことで、処理を実現しています。
def submit_cv(OpenCVによるメイン処理)
この関数がメイン処理を行う関数になります。
この関数では、以下の順で処理を行なっています。
- 画像を読み込む
- 画像に前処理を実施する
- 「顔と思われる部分」を検出する
- 検出した範囲に対してモザイク処理を実施する
- 処理を実施した画像を保存する
順番に詳しく解説していきましょう。
画像を読み込む
OpenCVではまず対象の画像を読み込む必要があります。
OpenCVで画像を読み込むときはcv2.imread関数を使います。
src = cv2.imread(IMG_PATH)
このようにすることでOpenCVで対象の画像データを扱えるようになります。
なお、cv2.imread関数のもう少し詳しい使い方については
「OpenCVで画像を読み込む方法【Python】」の記事に書いています。
画像に前処理を実施する
OpenCVで画像処理を行う際には「前処理」というものが必要になります。
これは画像処理を行えるようにインプット画像に処理を加えることです。
今回はcv2.cvtColor関数を使って読み込んだ画像をグレースケール化しています。
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
このように前処理を加えることで、後述の画像処理を行えるようになります。
なお、cv2.cvtColor関数を使ったグレースケール化については
「OpenCVでグレースケール画像を簡単に作成する【Python】」の記事で解説してます。
「顔と思われる部分」を検出する
今回のメイン処理である顔検出はcv2.CascadeClassifier関数で行っています。
face_cascade = cv2.CascadeClassifier(face_cascade_path)
なお、この関数は「haarcascade_frontalface_default.xml」を使っています。
このファイルは、OpenCVで使用する検出器です。
公式検出器はGithubからダウンロードできます。
https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
このファイルとcv2.CascadeClassifier関数を使うことで、
画像中から「顔と思われる部分」を検出することができます。
なお、OpenCVを使った顔検出の方法は
「OpenCVで顔を検出する【Python】」の記事で詳しく解説しています。
検出した範囲に対してモザイク処理を実施する
ここまでで検出した「顔と思われる部分」に対してモザイク処理を行いましょう。
facesには検出したエリアの
[左上角のx座標, 左上角のy座標, 幅, 高さ]
が格納されているのでこれらを取り出して先ほどのpixelate_area関数に渡します。
for x, y, w, h in faces:
dst_face = pixelate_area(src, x, y, w, h)
これで「画像中から顔を検出してモザイク処理を行う」コードが完成しました。
PythonやOpenCVなどのスキルをつけるなら
今回は、OpenCVを使って、モザイク処理を行う方法を解説しました。
OpenCVはマスターすれば強い武器になるライブラリの一つです。
もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。
この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。
OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説したモザイク化についても掲載されています。
エンジニアとしての自身の価値をチェックする(完全無料)
エンジニアとして、
自分の価値がどれくらいのものかご存知でしょうか?
エンジニアとしてIT業界に身を置いていると
今の会社でずっと働くのか、フリーランスとして独立するのか …
と様々な選択肢があります。
どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも
自身の価値を知っておくことはとても重要です。
TechClips ME では、
職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。
▼▼▼▼▼
▲▲▲▲▲
しかもTechClips MEでは想定年収を企業から提示してくれるので、
自身の価値を数字で分かりやすくたしかめることができます。
登録はもちろん完全無料なので、一度登録してみると良いかもしれません。
コメント