2016-05-11 20 views
0

入力として1つの画像を、第2入力として画像のリストを取り、どちらが最も似ているかを示すアルゴリズムはありますか?私たちの問題では、ウォーターマークのために同じ購入の表情が違うイメージを持つことができます。したがって、ウォーターマークが異なる場合でも一致するイメージを特定する必要があります。セット内で最も類似した画像を見つけるための画像比較アルゴリズム

これにニューラルネットワークが使用されていますか?特定のアルゴリズムはありますか?

答えて

2

キーポイント抽出とマッチングがこの問題の解決策の1つです。 SIFT、SURF、Fast-To-Trackなどのフィーチャディテクタを使用して、原画像やその他の画像のキーポイントを抽出します。最近では、SIFT検出器が一般的になってきており、精度と効率が非常に優れています。その後

は、特徴はRANSACアルゴリズム等により一致しています...

マッチング画像は、真の一致点の数によって定義することができます。

は、OpenCVの中でキーポイントアルゴリズムを参照することができます。 API:http://docs.opencv.org/2.4/modules/refman.html 例:http://docs.opencv.org/2.4/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.html#table-of-content-feature2d

1
  • 一つの可能​​なアプローチを非常に堅牢で、調整することができる知覚的ハッシュ、です。 Survey paper link

  • もちろん、これはDeep Learningでも行うことができますが、これにはもっと多くの作業が必要です。 Slides

問題設定の定義は常に必要です。ピクセル単位で等しい結果が得られますか(ピクセル作業で古典的なハッシュ処理さえも)さまざまな圧迫がありますか(堅牢性が必要です)。色変換や幾何変換(回転など)さえあります。サイズ変更... 古典的な知覚 - ハッシングアルゴリズムは、中程度の変換であっても非常に堅牢です。

いくつかの時間前に、私はimplementedという知覚フレームハッシュの単純な例(機能ではなくピクセル統計に基づいています)です。私はこれのようなものを「深く」行く前に試してみます:-)

質問プロセスの質問もあります。私は自分のアプローチのハッシング特性を覚えていませんが(ビットエラーのメトリックで十分かもしれませんが)、スライドのディープラーニングは類似点を保存しようとするので、クエリ中に距離/ランキングを得ることができます。

0

最も簡単なアプローチは登録(アライメント)です(ECC登録はMatlabとOpenCVの両方にあります)。これについてスキームを作成する方法を独自に考案することができます。

より良いアプローチは、Matlabに存在するMSERまたはFAST機能を使用することです。彼らの文書を使用して、彼らはあなたが尋ねるものを文字通り行います。

PS:Matlab 2015bにカスケードトレーナーが組み込まれています。あなたが求めていることだけを実行します。参照画像を取得し、背景なしの参照画像を求め、WALLAにはカスケード分類器が準備されています。左右の画像を左右に分類するために余分に使用します。

0

ウォーターマーク攻撃に取り組む場合は、イメージ攻撃のハッシュアルゴリズムをお勧めします。これらの攻撃に対しては、高速で堅牢です。私は結果が1,2,1,2、すべてパスしているあなたにいくつかの例

origin 00watermark 00 origin 01watermark 01 origin 02watermark 02 origin 03watermark 03

#include <opencv2/core.hpp> 
#include <opencv2/core/ocl.hpp> 
#include <opencv2/highgui.hpp> 
#include <opencv2/img_hash.hpp> 
#include <opencv2/imgproc.hpp> 

#include <iostream>  

void watermark_attack(cv::Ptr<cv::img_hash::ImgHashBase> algo) 
{ 
    std::vector<std::string> const origin_img 
    { 
     "origin_00.png", "origin_01.png", 
     "origin_02.png", "origin_03.png" 
    }; 
    std::vector<std::string> const watermark_img 
    { 
     "watermark_00.png", "watermark_01.png", 
     "watermark_02.png", "watermark_03.png" 
    }; 

    cv::Mat origin_hash, watermark_hash; 
    for(size_t i = 0; i != origin_img.size(); ++i){ 
     cv::Mat const input = cv::imread(origin_img[i]); 
     cv::Mat const watermark_input = cv::imread(watermark_img[i]); 
     //compute the hash value of image without watermark 
     algo->compute(input, origin_hash); 
     //compute the hash value of image with watermark 
     algo->compute(watermark_input, watermark_hash); 
     //compare the different between the hash values 
     //of original image and watermark image 
     std::cout<<algo->compare(origin_hash, watermark_hash) 
       <<std::endl; 
    }  
} 

int main() 
{ 
    using namespace cv::img_hash; 

    //disable opencl acceleration may(or may not) boost up speed of img_hash 
    cv::ocl::setUseOpenCL(false); 

    watermark_attack(AverageHash::create());   
} 

をお見せしましょう。

この小さなプログラムは、元の画像(左)と透かし兄弟(右)を比較します。計算結果の値が小さいほど、画像は似ています。 AverageHashの場合、推奨しきい値は5です(つまり、比較結果が5より大きい場合、イメージは非常に異なるとみなされます)。

ウォーターマークだけでなく、AverageHashはコントラスト、ノイズ(ガウス、ペッパー、塩)、サイズ変更、およびJPEG圧縮攻撃でも動作する別の「副作用」を提供します。

イメージハッシュを使用するもう1つの利点は、イメージのハッシュ値をファイルに保存できることです。ハッシュ値を何度も何度も計算する必要はありません。

Simple and fast method to compare images for similarityは、opencvのimg_hashモジュールの詳細を示します。

関連する問題