Question

Woohoo, je suis venu aux tableaux maintenant, dieu merci.

Maintenant, j'ai 2 tableaux!

int colorvalues[][]  = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};

Imaginez-le comme une image 4x4 pixels

Maintenant, je veux créer un histogramme, la distribution des valeurs de couleur de 0 à 255. Par exemple, ici, j'ai 2 * 255, 2 * 127, 5 * 34 et ainsi de suite.

J'ai donc créé un histogramme int [] = new int [255];

Pour vérifier si mes valeurs de couleur sont correctes, j'ai écrit:

 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]);
     }
 }

Jusqu'ici, tout va bien. Maintenant, comment puis-je écrire une procédure qui va dans l'histogramme [255] de 0 à 255 et la compare à la valeur des valeurs de couleur [] [], et si, par exemple, l'histogramme [34] se compare aux valeurs de couleur [] [] il ajoute 5 à l'histogramme [34]. Parce qu'il y a 5 fois 34 dans les valeurs de couleur [] [].

Peut-être que ma pensée est fausse et que je devais avoir un histogramme [255] [], 255 pour les valeurs de couleur comprises entre 0 et 255 et l'autre pour le compteur. Même dans ce cas, comment puis-je m'en rendre compte?

Était-ce utile?

La solution

En fait, vous ne devriez pas parcourir l’histogramme et, pour chaque valeur possible, effectuer une itération sur l’image. Itérer sur l'image devrait suffire:

for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
             histogram[colorvalues[i][j]]++;
     }
}

Vous pouvez simplement prendre la valeur de luminosité dans votre image sous la forme d'un index dans le tableau d'histogrammes.

Et vous n'avez pas besoin de créer un tableau de tableaux pour sauvegarder le compteur. N'oubliez pas qu'un tableau n'est rien d'autre qu'une liste de "cellules". pour une certaine valeur. un int [] est simplement une plage de "cellules". qui peut contenir une valeur entière. C'est ton compte. L’index dans la liste de cellules est la valeur de luminosité de l’histogramme. Pour chaque tableau, vous avez ces deux informations: un index de la cellule et la valeur de cette cellule. Vous devez juste comprendre comment utiliser les deux.

Et comme PSpeed ?? dans le commentaire, vous voudrez peut-être vous assurer que le code ne tentera pas réellement d'accéder à valeurs hors des limites de ce tableau:

if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
    histogram[colorvalues[i][j]]++;
}

Cela est nécessaire car vos valeurs de couleur sont int , c'est-à-dire qu'elles peuvent contenir des valeurs comprises entre & # 8722; 2147483648 à 2147483647. Ce qui est une plage beaucoup plus large que ce que votre histogramme peut gérer. Ainsi, si une valeur de couleur est par exemple 3456, le programme s’arrêterait dans la boucle en raison d’un ArrayIndexOutOfBoundsException . Parce que le code permet d’accéder à une valeur du tableau histogram avec l’index 3456, valeur qui dépasse de loin l’index maximal utilisable de 255.

ETA: En ce qui concerne votre histogramme int [255] : j'ai totalement oublié celui-là, désolé. Lors de la création d'un nouveau tableau en Java, vous spécifiez la longueur , pas l'index maximal. Donc, quoi que vous utilisiez est plus grand d'un exactement que l'index maximum qui peut être utilisé dans le tableau. Donc, new int [256] est un tableau dont les index vont de 0 à 255.

Autres conseils

Je serais tenté d'ajouter les valeurs d'histogramme dans une TreeMap où la clé de carte est la valeur de couleur et la valeur de carte est le nombre.

La taille de la carte augmentera automatiquement, aucun problème d’indexage hors limites, etc., elle sera automatiquement triée par ordre de taille.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top