现在,我有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]);
}
}
到目前为止,这么好。现在,如何编写直方图[255]中从0到255的过程,并将其与colorvalues [] []的值进行比较,例如,如果histogram [34]与colorvalues [] []进行比较它为直方图增加了5 [34]。因为在colorvalues [] []中有5次34次。
也许我的想法是错误的,我应该有直方图[255] [],255用于从0到255的颜色值,另一个用于计数器。即便如此,我怎么意识到它?
答案 0 :(得分:3)
实际上,您不应该迭代直方图,并且每个可能的值都会迭代图像。迭代图像就足够了:
for(int i=0; i < colorvalues.length; i++){
for (int j = 0; j < colorvalues.length; j++){
histogram[colorvalues[i][j]]++;
}
}
您可以将图像中的亮度值作为索引添加到直方图数组中。
并且您不需要创建一个数组数组来保存计数器。请记住,数组只不过是某个值的“单元格”列表。 int[]
只是一系列可以保存整数值的“单元格”。这是你的数量。 index 到单元格列表中是直方图的亮度值。对于每个数组,您都有这两条信息:单元格的索引和该单元格中的值。你只需要弄清楚如何使用它们。
正如注释中的PSpeed注释,您可能希望确保代码实际上不会尝试访问该数组边界之外的值:
if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
histogram[colorvalues[i][j]]++;
}
这是必需的,因为您的颜色值为int
s,也就是说,它们可以保存从-2147483648到2147483647的值。这是一个比直方图可以容纳的范围更大的范围。因此,如果颜色值恰好是3456,那么程序将因为ArrayIndexOutOfBoundsException
而在循环中停止。因为代码trid访问索引为3456的histogram
数组中的值,这超出了最大可用索引255.
ETA:至于您的直方图为int[255]
:我完全忽略了那个,对不起。在Java中创建新数组时,指定 length ,而不是最大索引。因此,无论您使用什么,它都会比可以在数组中使用的最大索引大一个。所以new int[256]
是一个索引从0到255的数组。
答案 1 :(得分:0)
我很想将直方图值添加到TreeMap中,其中地图键是颜色值,地图值是计数。
地图会自动增加大小,索引越界没有问题等。它会自动按大小顺序排序。