前記事の続編です。
前記事では,写真に写る人物の顔部分に絵文字を貼り込むことでマスキングを行いました。本記事では,その応用として,顔部分にモザイクをかけるスクリプトを作ってみましょう。
前記事同様,次のような要件とします。
要件
- macOS のデフォルト状態で動作する。ユーザに対して,事前に何らかのツールをインストールしておくなどの準備を要求しない。
- コマンドラインから使えるシェルスクリプトとする。
- 人物の顔部分にモザイクをかけた画像をJPEGファイルとして出力する。
- 写真の中に複数人が写っている場合にも対応する。
実装方法
- macOS に標準搭載されている Vision フレームワークというAPI群に含まれる顔認識エンジンを利用して顔認識を行う。
- モザイク処理は,macOS の Core Image の
CIPixellate
フィルタで行う。 - 元画像の全体をモザイク処理した画像を別途用意しておき,元画像において「顔」と認識された長方形部分それぞれについて,「モザイク処理後全体画像」の対応する部分を上から貼り込むことで,「顔だけモザイク」を実現する。
- 以上をまずは Swift コードで書いておき,それを Swift → Objective-C → AppleScriptObjC → シェルスクリプト と書き換えてゆくことで,macOS標準環境で動くシェルスクリプトとする。
完成形のシェルスクリプト
使い方
$ ./mosaicFaces.sh input.jpg output.jpg
とすると,input.jpg
の顔部分にモザイク処理した画像を output.jpg
として出力します。入力ファイルは,*.jpg
, *.png
, *.heic
など,macOSが標準で読めるファイル形式ならばOKです。出力ファイルはJPEG形式となります。
オプション
--scale <VALUE>
:モザイク処理の粒のスケール指定。数字が大きいほど,モザイクの粒の単位が大きく(粗く)なってゆく。(デフォルト:30
)--compression <VALUE>
:出力するJPEG画像の圧縮率を0.0
~1.0
の値で指定。1.0
だと無圧縮,0.0
だと最大圧縮。(デフォルト:0.8
)--dpi <VALUE>
:出力するJPEG画像のdpi値を指定(デフォルト:72
)
サンプル
入力ファイル
前記事で用意した,AIによる架空画像を,サンプルとして再び用います。
出力ファイル
$ ./mosaicFaces.sh --scale 20 input.jpg output.jpg
とすると,このような出力が得られます。