2

すべての画像が JPEG で圧縮されており、ノイズが多い 2 つの異なる画像で同一の領域を検索するのに最適なライブラリを探しています。なかなか見つからなくて困っています。問題は、jpeg をズームすると、モネのように見えることです。つまり、ノイズには、元の画像とは直接関係のないカラー パレットが含まれています。したがって、画像内で同一の配列を検索する代わりに、「最も類似した配列」を見つける必要があります。

これらの画像は、Google マップの同様の Web サイトのランダムなスクリーンショットから取得されており、画像は jpeg 以外の形式にすることはできません。

私は多くの手動の方法を試しました。

私の方法の1つは次のとおりです。

  • 2 つの画像を小さい画像に変換する
  • それらを 4bpp 画像で変更するか、色数を減らします
  • 画像 1 の一部を取得する
  • 画像 2 で画像 1 のトリミングされた部分の byte[] 配列バージョンを検索する
  • 同一を検索するのではなく、類似の一致を検索します。

    このアルゴリズムは機能しますが、すべてを 1 次元配列で行っているため、非常に低速です。

    このアルゴリズムを直接実行する既存のライブラリはありますか?

    私のアルゴリズムは次のとおりです。

        // Where SRC is the bigger image in which I search
        // Offset is where in my small image I start to search
        // Len is how long is my searched array
        // Size is the size of the bigger image in which I'm searching.
        // private Point simpleSearch(byte[] src, int offset, int len, byte[] search, Size size)
        {
            byte[] ddd = new byte[len];
            Array.Copy(search, offset, ddd, 0, len);
            int lowest = 100000000;
            int locmatch = 0;
            for (int i = 0; i < src.Length - len; i++)
            {
                int thed = 0;
                for (int a = 0; a < len; a++)
                {
                    int diff = Math.Abs(src[i + a] - ddd[a]);
                    thed += diff;
                }
    
                thed = thed / len;
                if (thed < lowest)
                {
                    lowest = thed;
                    locmatch = i-len;
                }
            }
    
            int yy = (locmatch / size.Width);
            int xx = locmatch - (yy * size.Width);
            Point p = new Point(xx, yy);
            return p;
        }
    
  • 4

    1 に答える 1

    2

    はい、相関またはスペクトル シグネチャは、2 つの画像領域がどの程度似ているかを示す方法です。しかし、ここで本当に欲しいのは、重複領域を効率的に検索するアルゴリズムだと思います。

    対応問題は、画像のどの部分が別の画像のどの部分に対応するかを把握しようとするコンピューター ビジョンで明確に定義された問題です。RANSACベースのアルゴリズムがあります。

    複雑さを対数の順序に下げる四分木アルゴリズムもあります。

    于 2012-04-27T21:20:10.573 に答える