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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top