Arrays: Contagem, comparando e Aumento
-
08-07-2019 - |
Pergunta
Woohoo, eu vim para matrizes agora, graças a Deus.
Agora, eu tenho 2 arrays!
int colorvalues[][] = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};
Imagine-o como uma imagem de pixel 4x4
Agora, eu quero criar um histograma, a distribuição de colorvalues ??de 0 a 255. Por exemplo, aqui eu tenho 2 * 255, 2 * 127, 5 * 34 e assim por diante.
Então, eu criei um histograma int [] = new int [255];
Para testar se os meus colorvalues ??está correta escrevi:
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]);
}
}
Até agora, tão bom. Agora, como faço para escrever um procedimento que vai no histograma [255] de 0 a 255, e compara com o valor de colorvalues ??[] [], e se, por exemplo, histograma [34] compara a colorvalues ??[] [] ele adiciona 5 a histograma [34]. Porque há 5 vezes 34 em colorvalues ??[] [].
Talvez o meu pensamento é errado e eu era suposto ter histograma [255] [], 255 para colorvalues ??de 0 a 255 e outra para o balcão. Mesmo assim, como posso realizá-lo?
Solução
Você realmente não deve iterar sobre o histograma e para cada valor possível iterate sobre a imagem. Iteração sobre a imagem deve ser suficiente:
for(int i=0; i < colorvalues.length; i++){
for (int j = 0; j < colorvalues.length; j++){
histogram[colorvalues[i][j]]++;
}
}
Você pode simplesmente tomar o valor de luminosidade em sua imagem como um index na matriz histograma.
E você não precisa criar um array de arrays apenas para salvar o contador. Lembre-se que uma matriz é nada mais do que uma lista de "células" para um determinado valor. um int[]
é apenas uma série de "células" que podem conter um valor inteiro. Essa é a sua contagem. O índice em que lista de células é o seu valor de brilho para o histograma. Para cada matriz que você tem essas duas informações: Um índice da célula e o valor nessa célula. Você só precisa descobrir como usar ambos.
E, como PSpeed ?? notas no comentário, você pode querer certificar-se de que o código não vai realmente tente acessar valores fora dos limites dessa matriz:
if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
histogram[colorvalues[i][j]]++;
}
Isso é necessário porque os seus valores de cor são int
s, isto é, eles podem armazenar valores de -2147483648 a 2147483647. Qual é o alcance de uma maneira maior do que o que o seu histograma pode acomodar. Então, se um valor de cor passa a ser 3456, por exemplo, o programa iria parar no circuito por causa de uma ArrayIndexOutOfBoundsException
. Uma vez que o código de acesso trid para um valor na matriz histogram
com índice de 3456 que está muito para além do índice utilizável máximo de 255.
ETA: Como para o seu histograma sendo int[255]
: I esquecido totalmente que um, desculpe. Ao criar uma nova matriz em Java, você especificar o comprimento , e não o índice máximo. Então, o que você usa não é maior por exatamente um do que o índice máximo que pode ser utilizado na matriz. Assim new int[256]
é uma matriz que tem índices de 0 a 255.
Outras dicas
eu estaria tentado a acrescentar os valores do histograma em um TreeMap onde a chave do mapa é o valor da cor e do valor do mapa é a contagem.
O mapa irá aumentar de tamanho automaticamente, sem problemas com o índice fora dos limites etc, serão classificados automaticamente em ordem de tamanho.