ある画像と、それを変形した画像を同一だと判定したい。
それはSIFTやらSURFの仕事なのだけど、どのぐらいの変形でどのぐらいの性能があるのかは把握しておかないと、土台の部分なのであとでいろいろ困りそう。
良い評価方法が見つからなかったので、適当に考える…。
画像Aと画像Bの類似度を
def features(image): #画像の特徴点のリストを返す。 def min_dist(feature, features): #特徴点featureとfeaturesの中の全てを比較して、最小距離を返す。 #最小値0。 def similarity(A, B): #画像AとBの類似度を返す。 #最大値0。最小値はAの特徴点が多いと小さくなるので注意。 score = 0 for feature in features(A): score -= min_dist(feature, features(B)) return score
とすれば、同一画像で0。変形を強めると、変形画像とのスコアは小さくなっていって、その他の画像とのスコアの期待値に近づく。はず。
とりあえず以下をプロットしてみた。
#違う画像同士の特徴点の最小距離 for A in dataset: for B in dataset: if A == B: continue for feature in features(A): print min_dist(feature, features(B))
#ある画像と変形画像の特徴点の最小距離 for A in dataset: for feature in features(A): print min_dist(feature, features(transform(A)))