10

少し前に、この質問に答えるために、2つの画像が同一であるかどうかを判断する方法を探すことに時間を費やしました。私は今、わずかに異なる問題に直面しています。手元に約2,000枚の画像があり、そのうちのいくつかは同じ内容ですが、互いにスケーリング/回転されたバージョンです(回転は常に90°の倍数です)。さまざまな圧縮と画像形式(主にjpg、一部のpng、その他はありません)。スケーリングは約2:1を超えません。私がやりたいのは、最高品質のインスタンスを保持しながら、重複を排除することです。私がかなり熟練している言語はJavaだけなので、Javaを使用する必要があります。

別の質問への回答は多くの有用なリンクを提供しますが、スケーリング/回転したときに重複を識別できるものはないようです。

この質問と回答は、最初にすべての画像を非常に小さいサイズ(たとえば、32*32または16*16)にスケーリングし、次に基本的にいくつかのハッシュを実行し、ハッシュに基づいて比較することを提案します。これは私には十分賢く聞こえます。画像は比較前に事前に並べ替えることができますが、並べ替え後にはO(n)の問題になります。ただし、画像が回転する可能性があるため、対処方法がわかりません。1つのオプションは、すべての画像を手動で調べて、画像の向きが明確である場合に回転を決定することです(人間の目は、どちらの方向に「上」にするかを非常に簡単に決定できます)。可能であれば、それは避けたいと思います。

この種の問題に対処するための確立された方法/アルゴリズム(リンクはSSIMに言及しています)がありますか、または上記よりも優れた方法を思い付くことができますか?たぶん誰かがタスクに適したJavaのライブラリを知っていますか(リンクされた質問には、OpenCV、次にImageJ、imgsclrのJavaラッパーについての言及があります)?どんな助けでも大歓迎です。

4

2 に答える 2

5

この質問に対する一般的な答えは、局所的な不変の特徴を生成する教師なし機械学習アプローチ(基本的には、スケーリングや回転によって変化しないハッシュを見つけるための素晴らしい方法)を必要とし、クラスタリングアルゴリズムを実行する必要があると思います。関連する可能性のあるいくつかの論文は次のとおりです。

于 2013-03-06T02:12:59.087 に答える
0

dHashはこれに必要なものだと思います。回転を考慮に入れるには、dHashを改善する必要があります。つまり、2000枚の画像は8000枚の画像と見なされます。

私はこの数日前に純粋なJavaライブラリを作成しました。あなたはそれをディレクトリパス(サブディレクトリを含む)でフィードすることができます、そしてそれはあなたが削除したい絶対パスでリストに重複した画像をリストします。または、これを使用して、ディレクトリ内のすべての一意の画像を検索することもできます。

内部的にはawtapiを使用していたため、Androidでは使用できません。imageIOは多くの新しいタイプの画像を読み取るのに問題があるため、内部で使用されている12個のサルの瓶を使用しています。

https://github.com/srch07/Duplicate-Image-Finder-API

内部に依存関係がバンドルされたJarは、 https://github.com/srch07/Duplicate-Image-Finder-API/blob/master/archives/duplicate_image_finder_1.0.jarからダウンロードできます。

APIは、異なるサイズの画像間でも重複を見つけることができます。

于 2016-01-26T17:42:43.163 に答える