モノクロ画像の類似検索
Posted feedbacks - VB.net
BitArrayを使ってます。それゆえ、全く同じ形式・ファイルサイズの場合のみ動き、 ヘッダ情報は一緒ということにしてファイル全部をXORしてます。 XOR後、立っているビットを数えている部分が非常にスマートではないね……。 「類似度を判定するコード」の方が良かったと結論でているので言うのもなんですが、 「一番その画像に似ている画像を見つけるコード」の場合、 探索の最初に似ている画像が見つかれば、それ以降の探索時間を短くできるので、 検証に使用する画像がないと時間の比較しようがないですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | Public Function GetMostSimilarImage(ByVal source As String, ByVal target() As String) As String
Dim ba1 As New BitArray(System.IO.File.ReadAllBytes(source))
Dim min As Integer = Integer.MaxValue
Dim diff As Integer
Dim mostSimilar As String = ""
Dim i, j As Integer
For i = 0 To target.Length - 1
Dim ba2 As New BitArray(System.IO.File.ReadAllBytes(target(i)))
ba2.Xor(ba1)
diff = 0
For j = 0 To ba2.Length - 1
If Not ba2(j) Then
Continue For
End If
diff += 1
If diff > min Then
Exit For
End If
Next
If diff < min Then
min = diff
mostSimilar = target(i)
End If
Next
Return mostSimilar
End Function
|


にしお
#3393()
Rating0/0=0.00
説明のために2*3のサイズで説明します。
この場合、画像1とは4つのピクセルが同じ値なので類似度は4、 画像2との類似度は2、画像3とは上半分の3つと下半分の白2つが一致するので類似度は5、よって一番類似しているのは画像3となります。このお題の趣旨は検索処理の実行速度にあるので、 実行してみて実用的な速度で動くことを確認することを強く推奨します。 可能であればマシンのスペックと実行にかかった時間を書いてもらえると参考になっておもしろいと思います。
なおこのお題はC言語からスクリプト言語への挑戦状です。 スクリプト言語に有利な問題が多すぎるので、この手の問題も大募集します。
[ reply ]