2013-03-05 14 views
10

少し前に、this questionと答えるために2つの画像が同じかどうかを判断する方法を探しました。私は現在、わずかに異なる問題に直面しています:私は手元に約2,000の画像を持っていますが、その中のいくつかは同じコンテンツを持っていますが、スケール/回転バージョンです(回転は常に90°の倍数です)。さまざまな圧縮と画像フォーマット(主にjpg、いくつかのpng、その他はありません)。スケーリングはおよそ2:1を超えません。私がしたいのは、最高品質のインスタンスを保持しながら重複を排除することです。 Javaは私がかなり熟練している唯一の言語なので、Javaを使う必要があります。Javaで同じ内容の画像を確認する

The answers多くの有用なリンクを提供していますが、スケールされた/回転されたときに重複を識別することはできません。

This question along with the answersは、すべての画像を最初に非常に小さなサイズ(32 * 32または16 * 16など)にスケーリングしてから、基本的にハッシュを行い、ハッシュに基づいて比較します。これは私にとって十分にスマートに聞こえる、画像は比較の前にあらかじめソートすることができ、ソート後はO(n)の問題になります。しかし、画像が回転している場合、どのように対処するか分かりません。 1つの選択肢は、手動ですべての画像を通過し、回転を決定することである。なぜなら、それらの描写が明確な方向性を有するからである(人間の目は、どのように「上に」あるべきかを非常に容易に決定できる)。可能であれば、私はそれを避けたいと思います。

この種の問題に対処するための確立された方法/アルゴリズム(リンクにはSSIMが記載されています)がありますか?誰かが、Javaのためのライブラリを知っているかもしれませんが、それはタスクに適しています(リンクされた質問には、OpenCV用のJavaラッパー、ImageJ、imgsclrという言葉があります)。どんな助けもありがとうございます。

答えて

5

私はこの疑問に対する一般的な答えは、局所的な不変な特徴 - 基本的に、スケーリングやローテーションで変化しないハッシュを見つけ出すファンシーな方法 - そしてクラスタリングアルゴリズムを実行する、 。ここでは、関連するかもしれないいくつかの論文は、以下のとおりです。

+0

乾杯、私はそれらを見てみましょう - しっかりした音! –

+0

この資料を見た後、私はあなたにいくつかのupvotesを与えるだろう;私がやりたいことをするのに十分な以上! –

0

だからまあ、私はdHashが何かだと思いますあなたはこれを必要とします。 回転を考慮するにはdHashを改善するだけです。つまり、2000画像は8000画像とみなされます。

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

これはawt apiを内部で使用していたため、Androidには使用できません。 imageIOは新しい種類の画像を読むのに問題があるので、私は内部的に使用されている12の猿のジャーを使用しています。内部バンドル依存関係

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

ジャーはあまりにも異なるサイズの画像の中から重複を見つけることができますhttps://github.com/srch07/Duplicate-Image-Finder-API/blob/master/archives/duplicate_image_finder_1.0.jar

API、からダウンロードすることができます。

関連する問題