配列:カウント、比較、増加
-
08-07-2019 - |
質問
うーん、私は今アレイに来ました、神に感謝します。
今、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に追加したいのですが、マップキーは色の値で、マップ値はカウントです。
マップのサイズは自動的に増加し、範囲外のインデックスなどの問題はありません。サイズ順に自動的にソートされます。