質問

うーん、私は今アレイに来ました、神に感謝します。

今、2つの配列があります!

int colorvalues[][]  = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};

4x4ピクセルの画像として想像してください

次に、0〜255のカラー値の分布であるヒストグラムを作成します。たとえば、ここでは2 * 255、2 * 127、5 * 34などです。

だから、int histogram [] = new int [255];

を作成しました

カラー値が正しいかどうかをテストするために書きました:

 for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
         System.out.println("Colorvalue in Array " + i + "." + j + " is" + colorvalues[i][j]);
     }
 }

これまでのところ、とても良い。ここで、0から255までのhistogram [255]に入り、colorvalues [] []の値と比較するプロシージャを作成するにはどうすればよいですか。たとえば、histogram [34]がcolorvalues [] []と比較する場合ヒストグラムに5を追加します[34]。 colorvalues [] []には34の5倍があるため。

たぶん私の考えは間違っていて、ヒストグラム[255] []、0から255までのカラー値には255、そしてカウンターにはもう1つがあるはずです。それでも、どうすれば実現できますか?

役に立ちましたか?

解決

実際には、ヒストグラムを反復してはならず、可能な値ごとに画像を反復するべきではありません。画像を繰り返し処理するだけで十分です:

for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
             histogram[colorvalues[i][j]]++;
     }
}

画像の明るさの値を index としてヒストグラム配列に取り込むことができます。

そして、カウンターを保存するためだけに配列の配列を作成する必要はありません。配列は「セル」のリストに過ぎないことを忘れないでください。特定の値に対して。 int [] は単なる「セル」の範囲です。整数値を保持できます。それがあなたの番です。そのセルのリストへのインデックスは、ヒストグラムの輝度値です。配列ごとに、セルのインデックスとそのセルの値という2つの情報があります。両方を使用する方法を理解する必要があります。

そして、コメントの PSpeed のメモにあるように、コードが実際にアクセスを試みないことを確認したい場合があります。その配列の境界外の値:

if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
    histogram[colorvalues[i][j]]++;
}

色の値は int であるため、つまり、&#8722; 2147483648〜2147483647の値を保持できるため、これが必要です。これは、ヒストグラムが対応できる範囲よりもかなり広い範囲です。したがって、たとえば色の値が3456である場合、プログラムは ArrayIndexOutOfBoundsException のためにループで停止します。コードは、使用可能な最大インデックス255をはるかに超えるインデックス3456を持つ histogram 配列の値にアクセスしようとしたためです。

ETA:ヒストグラムが int [255] であることについては、すみませんでした。 Javaで新しい配列を作成するときは、最大インデックスではなく length を指定します。したがって、使用するものは何でも、配列で使用できる最大インデックスよりも1だけ大きくなります。したがって、 new int [256] は0〜255のインデックスを持つ配列です。

他のヒント

ヒストグラム値をTreeMapに追加したいのですが、マップキーは色の値で、マップ値はカウントです。

マップのサイズは自動的に増加し、範囲外のインデックスなどの問題はありません。サイズ順に自動的にソートされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top