2017-05-10 9 views
0

私はいくつかのタイプの画像オブジェクトを持つ画像データベースの作成を任されました。各画像は、2次元のピクセル配列で構成されています。 MatchPattern(イメージサブイメージ、イメージイメージ):この関数は、サブイメージがイメージに何回繰り返して表示されるかを表す整数を返します。次のように大きな2D配列の中で、より小さい2D配列のマッチングを探すにはどうすればよいですか?

私が書いたコードは次のとおりです。

public int MatchPattern(Image subimage, Image image) { 
    if(image.getClass().equals(subimage.getClass())){ 
     int numOfMatches = 0; 

     int imgWidth = image.getWidth(); 
     int imgHeight = image.getHeight(); 

     int subimgWidth = subimage.getWidth(); 
     int subimgHeight = subimage.getHeight(); 

     if (imgWidth < subimgWidth || imgHeight < subimgHeight) 
      return 0; 
     for (int i = 0; i < imgHeight; i++) { 
      for (int j = 0; j < imgWidth; j++) { 

       int subHeightIndex = 0; 
       int subWidthIndex = 0; 

       Pixel imagePix = image.getImg()[i][j]; 
       Pixel subimgPix = subimage.getImg()[subHeightIndex][subWidthIndex]; 

       if((imagePix.compareTo(subimgPix)==0) && ((imgWidth-j)>=subimgWidth) && ((imgHeight-i)>=subimgHeight)){ 
        boolean matchFlag = true; 
        for (int k = 0; k < subimgHeight; k++) { 
         if(matchFlag == false) 
          break; 
         for (int l = 0; l < subimgWidth; l++) { 
          matchFlag = (image.getImg()[i+k][j+l] == subimage.getImg()[k][l]); 
          if (matchFlag == false) 
           break; 
         } 
        } 
        if(matchFlag == true) 
         numOfMatches++; 
       }     
      } 
     } 
    return numOfMatches; 
    } 
    return 0; 

私はメソッドを実行するたびにしかし、それは常に試合のNUMを返す0に等しい誰もが正しい方向に私を指すことができますか? ありがとうございます。

+0

は、なぜあなたは 'if'文の中System.out.println''簡単な操作を行うと、コントロールが内部で起こっているかどうかを確認していません?基本的には、デバッガを通って制御がどこに行き、どこが期待通りにならないのかを確認し、なぜこれが...?最終的には、問題を絞り込んでその原因につきます。 –

+0

同じ問題について[post](http://stackoverflow.com/questions/297762/find-known-sub-image-in-larger-image)を参照しているとします。より良いアルゴリズムを見つけることが役立つかもしれません。この[post](http://stackoverflow.com/questions/12598818/finding-a-picture-in-a-picture-with-java)とこの[example](http://www.dreamincode.net/フォーラム/トピック/ 157963-finding-a-sub-image-in-a-larger-image /) –

+1

デバッガの使用方法を学ぶ –

答えて

0

"k"を "subimgWidth"、 "l"を "subimgHeight"と比較しないでください。

また、他のif文と同様に、ピクセルを "=="と比較したり、 ".equals"と比較したり、 ".compareTo"と比較したりしないでください。


アルゴリズムにはいくつか問題があります。私はいくつかのサンプル入力でこれをテストし、うまく動作するようです:

public int matchPattern(Image subimage, Image image) 
    { 
     int numOfMatches = 0; 

     int imgWidth = image.getWidth(); 
     int imgHeight = image.getHeight(); 

     int subimgWidth = subimage.getWidth(); 
     int subimgHeight = subimage.getHeight(); 

     if (imgWidth < subimgWidth || imgHeight < subimgHeight) 
     { 
     return 0; 
     } 

     for (int i = 0; i <= imgWidth - subimgWidth; i++) 
     { 
     for (int j = 0; j <= imgHeight - subimgHeight; j++) 
     { 
      int subHeightIndex = 0; 
      int subWidthIndex = 0; 

      Pixel imagePix = image.getImg()[i][j]; 
      Pixel subimgPix = subimage.getImg()[subHeightIndex][subWidthIndex]; 

      if ((imagePix.compareTo(subimgPix) == 0) && ((imgWidth - j) >= subimgWidth) && ((imgHeight - i) >= subimgHeight)) 
      { 
       boolean matchFlag = true; 
       for (int k = 0; k < subimgWidth; k++) 
       { 
        for (int l = 0; l < subimgHeight; l++) 
        { 
        matchFlag = 0 == (image.getImg()[i + k][j + l].compareTo(subimage.getImg()[k][l])); 
        if (!matchFlag) 
        { 
         break; 
        } 
        } 
       } 
       if (matchFlag) 
       { 
        numOfMatches++; 
       } 
      } 
     } 
     } 
     return numOfMatches; 
    } 
+0

ifステートメントで比較を修正しましたが、subimgWidthとsubimgHeightをインクリメントしましたが、まだ同じ問題が発生しています – Mahoufo

+0

@Mahoufo、あなたのコードを編集してコードがどのようになっているかを確認できます。古いバージョンしか見ることができない場合は、コードを手助けすることは非常に困難です。 –

+0

アップロードしたばかりのコードを試してみてください。全体的には、IDEを使用していない場合は、IDEを使用していることを確認してください。 Eclipseは無料です。既にIDEを使用している場合は、デバッガの使い方を学んでください。 IDEとデバッガを使用すると、数分でこの問題を解決できます。それは誰もがこのような状況でやることです。 –

関連する問題