哇哇,我现在来到阵列,感谢上帝。

现在,我有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的颜色值,另一个用于计数器。即便如此,我怎么意识到它?

有帮助吗?

解决方案

实际上,您不应该迭代直方图,并且每个可能的值都会迭代图像。迭代图像就足够了:

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的数组。

其他提示

我很想将直方图值添加到TreeMap中,其中地图键是颜色值,地图值是计数。

地图会自动增加大小,索引越界没有问题等。它会自动按大小顺序排序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top