画像の同一性をHuモーメントで比較してみた

#概要
「Huモーメントという指標で艦これ画像を比較してみた。」

## Huモーメントについて
画像を比較する指標は、Huモーメント不変量を使いました。
[Image moment - Wikipedia(en)](http://en.wikipedia.org/wiki/Image_moment)

Huモーメントは画像の回転や拡大縮小に対して不変な値を取ります。
実装はOpenCVに含まれているので、そのまま使うことができます。

またPython実装は下記を参考にしています。
画像読み込みはcv2.IMREAD_GRAYSCALE。
参考：[Huモーメント不変量による類似画像検索](http://d.hatena.ne.jp/m-a-o/20131104/p2)

## 例

画像セットは[@kiguchiyura](https://twitter.com/kiguchiyura)さんの[艦これアイコンまとめ【フリーアイコン】](http://togetter.com/li/545148)からお借りしました。

![matome.png](https://qiita-image-store.s3.amazonaws.com/0/24374/d028da2c-b867-c5c6-6c6f-eee8cda4bfb9.png)



|          |吹雪|熊野|雷|電|時雨|時雨改二|大井改|大井改二|Z1|Z3|
|----------|------|------|-----|-----|-----|-----|-----|-----|-----|-----|
吹雪     |  0.00 | 12.45 | 5.78 |  5.02 | 12.63 |12.94 |  9.07|  9.02|  3.94|  4.04|
熊野     | 12.45 |  0.00 | 8.08 |  9.76 | 0.73  |0.94  |  3.71|  3.72|  9.02|  9.29|
雷       |  5.78 |  8.08 | 0.00 |  9.32 | 8.14  |8.08  |  4.82|  4.76|  9.67|  9.66|
電       |  5.02 |  9.76 | 9.32 |  0.00 | 10.03 |10.07 |  6.40|  6.33|  1.73|  8.47|
時雨     | 12.63 |  0.73 | 8.14 | 10.03 | 0.00  |0.46  |  4.15|  4.16|  9.13|  9.13|
時雨改二 | 12.94 |  0.94 | 8.08 | 10.07 | 0.46  |0.00  |  4.54|  4.55|  9.53|  9.53|
大井改   |  9.07 |  3.71 | 4.82 |  6.40 | 4.15  |4.54  |  0.00|  0.08|  5.53| 12.41|
大井改二 |  9.02 |  3.72 | 4.76 |  6.33 | 4.16  |4.55  |  0.08|  0.00|  5.46| 12.40|
Z1      |  3.94 |  9.02 | 9.67 |  1.73 | 9.13  |9.53  |  5.53|  5.46|  0.00|  7.23|
Z3      |  4.04 |  9.29 | 9.66 |  8.47 | 9.13  |9.53  | 12.41| 12.40|  7.23|  0.00|


時雨や大井などの改二勢は改造前後の見た目もそっくりなので納得感がありますね。
一方で雷と電が一見良く似ているのに大きな差が出ているのは、髪の色の差を拾っているんじゃないかと思います。
時雨改二と吹雪でもっとも大きな差が検出されている理由も同様かもしれません。
今回はグレースケールで画像を読んでいるので、RGBなどを考慮すればもう少し近づくかもしれません。

## 色々な画像を比較

+ 回転変形、部分（台詞）変更、拡大縮小などの処理を通した場合

![ikaduti.png](https://qiita-image-store.s3.amazonaws.com/0/24374/81c6cf63-15d6-eb85-53a2-39126d7054dc.png) ![ikaduti_r.png](https://qiita-image-store.s3.amazonaws.com/0/24374/084b0827-cd55-9a37-de4d-06a72dd4eaeb.png) ![ikaduti_s.png](https://qiita-image-store.s3.amazonaws.com/0/24374/f1a88f21-420b-05f6-b2b8-fb1d7e7d9cd7.png) ![ikaduti_sc.png](https://qiita-image-store.s3.amazonaws.com/0/24374/dae5a839-4f17-bf94-0b78-a4b44aed4ff1.png) ![ikaduti_sc2.png](https://qiita-image-store.s3.amazonaws.com/0/24374/cc311077-8d9c-d211-0f03-4c0e209a3b13.png) 

|          |雷(オリジナル)|雷(回転)|雷(台詞変更)|雷(縮小・余白透過)|雷(縮小・余白埋め)|
|----------|------|------|------|------|------|
雷(オリジナル)     | 0.00  |0.16  |0.29  |0.03  |5.88
雷(回転)           | 0.16  |0.00  |0.39  |0.13  |5.96
雷(台詞変更)       | 0.29  |0.39  |0.00  |0.31  |5.71
雷(縮小・余白透過)     | 0.03  |0.13  |0.31  |0.00  |5.90
雷(縮小・余白埋め) | 5.88  |5.96  |5.71  |5.90  |0.00

縮小された余白を白で埋めたサンプルだけ異なる画像の判定がでています。なんでだろう。

+ waifu2x

![AHDu0cq.png](https://qiita-image-store.s3.amazonaws.com/0/24374/e3df304a-d4d7-c07c-794e-d797484de147.png) ![WJqqUHV.png](https://qiita-image-store.s3.amazonaws.com/0/24374/85595abd-4585-bbcc-720e-564441ea578f.png)
画像出典：[Using Waifu2x to Upscale Japanese Prints](http://ejohn.org/blog/using-waifu2x-to-upscale-japanese-prints/)

|          |img1.png|img2.png|
|----------|------|------|
| img1.png | 0.00 | 0.05 |
| img2.png |0.05  |0.00  |

[waifu2x](http://ultraist.hatenablog.com/entry/2015/05/17/183436)で変換した画像を比較したもの。元画像が同じなのでほぼ同値ですね。
余談ですが、この浮世絵の変換をレポートしているのはジョン・レシグ（jQueryの開発者）だったりします。（[Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%AC%E3%82%B7%E3%82%B0)）

# 手元でHuモーメントを比較する環境構築

サンプル次第ではもっと面白い結果が出ると思うので、Windows向けの実行手順をまとめておきます。
Python2、numpy、OpenCVを導入すれば同じ比較をすることができます。

### インストールの準備

パッケージ管理ツールとして[Chocolatey](https://chocolatey.org/)を使いました。Windows版のapt-getやyumのようなものです。
Nugetパッケージが登録されているソフトウェアはchocolateyコマンド1つで入り、一括管理できます。

### OpenCVのインストール

[公式配布ページ](http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.9/)からインストーラをダウンロードして展開するだけです。とても楽ですね。
今回は3.0.0-rc1をインストールしています。

### Pythonのインストール
chocolateyを使います。
Python2系のパッケージは2つ(python2とpython2-x86_32)ありますが、chocolateyで配布されているnumpyと自動で連動してくれるPythonは下記のコマンドからインストールできます。

```shell-session
$ chocolatey install python2-x86_32
$ chocolatey install numpy
```

### OpenCVのインポート

OPENCV_FILE_PATH\opencv\build\python\2.7\x64 にあるcv2.pydを
C:\Python27\Lib\site-packagesにコピーする。

```py:sample.py
import cv2
#code
print "hoge"
```

これでPython上でcv2が使えるようになるはずです。簡単。
ぜひ色々やってみてください。

### 追記
インストール手順や環境によっては、PATHがうまく設定されない場合があるかもしれません。
その場合、
 `C:\OPENCV_FILE_PATH\opencv-3.0.0\build\x64\vc11\bin`
 `C:\python2-x86_32`
へのパスを通してみてください。