Matrici: conteggio, confronto e aumento
-
08-07-2019 - |
Domanda
Woohoo, ora sono arrivato alle matrici, grazie a dio.
Ora ho 2 array!
int colorvalues[][] = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};
Immaginalo come un pixel 4x4
Ora, voglio creare un istogramma, la distribuzione dei valori di colore da 0 a 255. Ad esempio qui ho 2 * 255, 2 * 127, 5 * 34 e così via.
Quindi ho creato un istogramma int [] = new int [255];
Per verificare se i miei valori di colore sono corretti ho scritto:
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]);
}
}
Finora tutto bene. Ora, come posso scrivere una procedura che va nell'istogramma [255] da 0 a 255 e la confronta con il valore di colorvalues ??[] [], e se, ad esempio, l'istogramma [34] confronta con colorvalues ??[] [] aggiunge 5 all'istogramma [34]. Perché ci sono 5 volte 34 in colorvalues ??[] [].
Forse il mio pensiero è sbagliato e avrei dovuto avere l'istogramma [255] [], 255 per i valori di colore da 0 a 255 e l'altro per il contatore. Anche allora, come posso realizzarlo?
Soluzione
In realtà non dovresti iterare sull'istogramma e per ogni possibile valore iterare sull'immagine. Iterazione sull'immagine dovrebbe essere sufficiente:
for(int i=0; i < colorvalues.length; i++){
for (int j = 0; j < colorvalues.length; j++){
histogram[colorvalues[i][j]]++;
}
}
Puoi semplicemente prendere il valore di luminosità nell'immagine come indice nell'array dell'istogramma.
E non è necessario creare una matrice di array solo per salvare il contatore. Ricorda che un array non è altro che un elenco di " celle " per un certo valore. un int []
è solo un intervallo di " celle " che può contenere un valore intero. Questo è il tuo conto. L ' indice in quell'elenco di celle è il valore di luminosità per l'istogramma. Per ogni array hai queste due informazioni: un indice della cella e il valore in quella cella. Devi solo capire come usare entrambi.
E come PSpeed ?? nel commento, potresti voler assicurarti che il codice non provi effettivamente ad accedere valori al di fuori dei limiti di tale array:
if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
histogram[colorvalues[i][j]]++;
}
Ciò è necessario perché i valori del colore sono int
, ovvero possono contenere valori compresi tra -2147483648 e 2147483647. Che è un intervallo molto più ampio di quello che può contenere il tuo istogramma. Quindi, se ad esempio un valore di colore è 3456, il programma si arresterebbe nel ciclo a causa di un ArrayIndexOutOfBoundsException
. Perché il codice trid accede a un valore nell'array histogram
con indice 3456 che è ben oltre l'indice massimo utilizzabile di 255.
ETA: Per quanto riguarda il tuo istogramma int [255]
: ho completamente ignorato quello, scusa. Quando si crea un nuovo array in Java, si specifica la lunghezza , non l'indice massimo. Quindi, qualunque cosa tu usi, è più grande di esattamente uno dell'indice massimo che può essere usato nell'array. Quindi new int [256]
è un array che ha indici da 0 a 255.
Altri suggerimenti
Sarei tentato di aggiungere i valori dell'istogramma in una TreeMap in cui la chiave della mappa è il valore del colore e il valore della mappa è il conteggio.
La mappa aumenterà automaticamente in dimensioni, nessun problema con l'indice fuori limite ecc. verrà ordinata automaticamente in ordine di dimensioni.