Pythonと、OpenCVを使ったフォトモザイク処理を実装してみます。
まずは、処理速度を特に考慮しないでシンプルに実装を行ってみます。
高速化は施さず、バカ正直な実装なので、処理結果が返ってくるまでには、少〜し時間がかかります。
また、ファイルフォーマットはjpgオンリーです。
...フォトモザイクの原理を下記に説明しておきます。
フォトモザイクの原理
ベース画像:モザイク処理を掛ける元となる画像
サブ画像 :ベース画像に埋め込む画像
セル :ベース画像を四角形に分割したもの。
1. モザイク処理を掛けたい画像(以下、ベース画像といいます)を、
小さい四角形(以下、セル)に分割します。
2. 分割されたセルにそれぞれに対して、色の3原色(RGB値)の平均値を求めます。
3. サブ画像一枚一枚に対して、RGBそれぞれの平均値を求めます。
4. 個々のセルの平均RGB値に対してもっとも色が近い(※)サブ画像を決定し、縮小し、
ベース画像に埋め込んで行きます。
人間の眼?脳?は結構いい加減なもので、色が似ていると勝手に、
視覚イメージを補完してイメージを脳内に構成し、認識するみたいです。
※色の距離を、ピタゴラスの定理(三平方の定理)を利用して求めます。
x = サブ画像のR値 - ベース画像のR値
y = サブ画像のG値 - ベース画像のG値
z = サブ画像のB値 - ベース画像のB値
a = x^2 + y^2 + z^2
んで、aの平方根を取って"距離"と出来ます。
(ソース内では平方根は取らず2乗和aを距離としています。)
プログラムソース
ページの下に、リンク(PhotoMosaic.pyへの)を貼っています。
実行方法
下記の条件で、
ベース画像のファイルパス
/Users/miyamotoyukitake/Project/PhotoMosaic/ex-base.jp
サブ画像ディレクトリパス
/Users/miyamotoyukitake/Project/PhotoMosaic/
ベース画像分割数
縦、横ともに50
プログラムがあるカレントフォルダで、ターミナルから
コマンド
>> python PhotoMozaic.py /Users/miyamotoyukitake/Project/PhotoMosaic/ex-base.jpg /Users/miyamotoyukitake/Project/PhotoMosaic 50,50
ex-base.jpg
出力
今後は。。。
今回の実装は、シンプルな実装で高速化には手をつけていません。
また対応画像は、jpgフォーマットのみと寂しいので幾つか対応対処をば。
今後は特に、サブ画像をRGB空間に高速にマッチさせる仕組みを導入したり、
並列化を検討してみたり、Cythonの導入してみたり...といくつか試行して遊べそうです。
充分な高速化が実現できたら、動画に対応させたりとか。。。
実行環境
OS: OS X
Python: Ver 2.7 32bitバージョン
Pythonモジュール: cv2(OpenCV)、numpy(行列演算モジュール)