Frage

Juhuu, Gott sei Dank bin ich jetzt bei Arrays angelangt.

Jetzt habe ich 2 Arrays!

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

Stellen Sie es sich als 4x4-Pixel-Bild vor

Jetzt möchte ich ein Histogramm erstellen, die Verteilung der Farbwerte von 0 bis 255.Hier habe ich zum Beispiel 2*255, 2*127, 5*34 und so weiter.

Also habe ich ein int histogram[] = new int [255];

Um zu testen, ob meine Farbwerte korrekt sind, habe ich Folgendes geschrieben:

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

So weit, ist es gut.Wie schreibe ich nun eine Prozedur, die im Histogramm[255] von 0 bis 255 geht und es mit dem Wert von Farbwerten[][] vergleicht, und wenn beispielsweise Histogramm[34] mit Farbwerten[][] verglichen wird? es fügt 5 zum Histogramm hinzu[34].Denn es gibt 5 mal 34 in Farbwerten[][].

Vielleicht ist meine Denkweise falsch und ich sollte ein Histogramm[255][] haben, 255 für Farbwerte von 0 bis 255 und das andere für den Zähler.Selbst dann, wie merke ich es?

War es hilfreich?

Lösung

Sie sollten eigentlich nicht über das Histogramm iterieren und für jeden möglichen Wert das Bild iterieren.Das Durchlaufen des Bildes sollte ausreichen:

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

Sie können einfach den Helligkeitswert in Ihrem Bild als nehmen Index in das Histogramm-Array.

Und Sie müssen kein Array von Arrays erstellen, nur um den Zähler zu speichern.Denken Sie daran, dass ein Array nichts anderes als eine Liste von „Zellen“ für einen bestimmten Wert ist.ein int[] ist nur ein Bereich von „Zellen“, die einen ganzzahligen Wert enthalten können.Das ist deine Zählung.Der Index In diese Zellenliste wird Ihr Helligkeitswert für das Histogramm eingetragen.Für jedes Array stehen Ihnen diese beiden Informationen zur Verfügung:Ein Index der Zelle und der Wert in dieser Zelle.Sie müssen nur herausfinden, wie Sie beide verwenden.

Und wie PGeschwindigkeit Anmerkungen im Kommentar: Möglicherweise möchten Sie sicherstellen, dass der Code nicht tatsächlich versucht, auf Werte außerhalb der Grenzen dieses Arrays zuzugreifen:

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

Das ist notwendig, weil Ihre Farbwerte so sind ints, das heißt, sie können Werte von −2147483648 bis 2147483647 enthalten.Das ist ein viel größerer Bereich, als Ihr Histogramm aufnehmen kann.Wenn also beispielsweise ein Farbwert 3456 beträgt, würde das Programm aufgrund eines Fehlers in der Schleife anhalten ArrayIndexOutOfBoundsException.Weil der Code versucht hat, auf einen Wert im zuzugreifen histogram Array mit Index 3456, was weit über dem maximal verwendbaren Index von 255 liegt.

voraussichtliche Ankunftszeit: Was Ihr Histogramm betrifft int[255]:Das habe ich völlig übersehen, sorry.Wenn Sie in Java ein neues Array erstellen, geben Sie das an Länge, nicht der maximale Index.Was auch immer Sie dort verwenden, ist also um genau eins größer als der maximale Index, der im Array verwendet werden kann.Also new int[256] ist ein Array mit Indizes von 0 bis 255.

Andere Tipps

ich versucht sein, würde den Histogrammwert in eine TreeMap hinzuzufügen, wo die Karte Schlüssel der Farbwert und der Kartenwert ist die Zählung.

Die Karte wird automatisch in der Größe erhöhen, keine Probleme mit dem Index außerhalb der Grenzen usw. wird es automatisch in Größe sortiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top