読者です 読者をやめる 読者になる 読者になる

イラストと写真の判定

画像処理

2次画像と3次画像を自動分別するための判定関数を作ってみています。
今のところ考えた方法は、

1.人工的な色数の割合による判定
#FFFFFFや#000000など人工っぽい色の占める割合で判定する。人工的な色は、RGBに0x33で割り切れる値を含む色と定義した。イラストは人工的な色を多く使っているのではないかという予想。
2.ベタ塗りエリアを構成するピクセルの割合による判定
3x3マスを構成する全てのピクセルが同色のブロックをベタ塗りエリアと定義して、そのエリアが全体に占める割合によって判定する。イラストはベタ塗りエリアが多いのではないかという予想。
3.輪郭を構成する色の特徴による判定
輪郭線を抽出して輪郭線上の色の特徴から判定する。イラストは黒から灰色の範囲で輪郭線を描いている可能性が高いのではないかという予想。

で、実際使えるか調べるために、テキトウに用意した写真とイラストの各サンプル400枚から判定要素をCSVファイルに吐き出して、統計的に使えそうかを調べました。
結果は、2番の『ベタ塗りエリアを構成するピクセルの割合による判定』以外使えないということになりました。
ベタ塗り判定は使えるには使えますが、エラー率がイラスト側と写真側で約20%づつありました。イラスト400枚と写真400枚をまぜて自動分別させると、イラストのフォルダにイラスト320枚と写真80枚を分別して、写真のフォルダに写真320枚とイラスト80枚を分別するといった感じです。約20%づつというエラー率は統計的に求めた『ベタ塗りエリアが全体の7%以上ならイラストであり、7%未満なら写真である』という2分法による場合なので、『写真』と『イラスト』と『謎の画像』3つに分けるならもう少しエラー率を減らせます(減らすというか、微妙なのは謎の画像に分類してしまう)。また3x3ではなく、5x5などベタ塗りエリアの定義を変えると結果が変わってきそうです。(これも2〜10くらいの場合のエラー率を統計とって最適なサイズを求めるといいかも?)

人間の僕はどうやって判定している?

たぶん、光が正確に処理されているか? YES/NO。これを判定するのは難しいと思ったのであきらめました。人生の最終目的くらいに設定しないと作れそうにないです。


このイラストと写真の判定の定石ってあるのでしょうか?