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?

Foi útil?

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 ints, 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top