Hey Leute Ich versuche in C++ (Qt) ein Programm zu schreiben, welches ein Histogramm erzeugt. Daher poste ich diesen Beitrag in diesem Forum. Nun zu meiner eigentlichen Frage: Muss ich, wenn im Histogramm (x-Achse) gezoomt wird, das Histogramm neu berechnen, oder kann ich einfach die "Bins" (Balken) entsprechend grösser oder kleiner darstellen? Denn wenn ich bloss die Anzeige und nicht das Histogramm an sich ändere, brauche ich weniger zu rechnen, was ich möglichst optimieren möchte. P.s. Kennt jemand womöglich eine Bibliothek für die Berechnung von Histogrammen?
GreenHorn schrieb: > Kennt jemand womöglich eine Bibliothek für die Berechnung von > Histogrammen? Was für eine Bibliothek braucht man da? Array bzw. Arrays entsprechend der Farbtiefe anlegen (bei jpg drei für R, G und B mit 256 Einträgen, bei monochrom mit 8 Bit eines mit 256 Einträgen, bei 16-Bit-RGB drei mit 64k Einträgen etc.), mit Nullen initialisieren, alle Bildpunkte iterieren und je nach Farbwert des Bildpunktes den/die entsprechenden Arrayeintrag/einträge erhöhen. > Muss ich, wenn im Histogramm (x-Achse) gezoomt wird, das Histogramm neu > berechnen, Überleg' mal. Beeinflusst das Zoomen des Histogrammes das Quellmaterial? > oder kann ich einfach die "Bins" (Balken) entsprechend > grösser oder kleiner darstellen? Beim Zoomen auf der x-Achse werden sie breiter oder schmaler.
>Muss ich, wenn im Histogramm (x-Achse) gezoomt wird, das Histogramm neu >berechnen, oder kann ich einfach die "Bins" (Balken) entsprechend >grösser oder kleiner darstellen? neu Berechnen alles andere funktioniert nur in ganz wenigen Ausnahmefällen..
Robert L. schrieb: > neu Berechnen Wozu? Es wird die Darstellung des Histogrammes gezoomt, nicht das Quellmaterial. Also verändert sich das Histogramm nicht; warum also sollte man es neu berechnen?
was er meint, ist, dass er die Breite der einzelnen Bins variieren will beim Reinzoomen. dH das Histogram ändert sich schon. Und für die Ursprungsfrage: ich würde das komplette Histogramm berechnen und im Speicher halten. Für die Anzeige und das rein und rauszoomen, kann man immer noch Bins zusammenaddieren. Aber man muss nicht bei jedem Zoomschritt neu durchs Bild laufen.
:
Bearbeitet durch User
Vlad Tepesch schrieb: > was er meint, ist, dass er die Breite der einzelnen Bins variieren will > beim Reinzoomen. dH das Histogram ändert sich schon. Nein. Nur die Darstellung ändert sich. Statt alle "Bins" von 0 bis 255 darzustellen, werden nur noch die von z.B. 50 bis 100 dargestellt. Was soll dafür neu berechnet werden?
da jeder unter "Histogramm", "Anzeige", "neu Berechnen", "neu durchs Bild laufen" was anders Versteht/Meint werden wir wohl auf keine grünen Zweig kommen...
>Was soll dafür neu berechnet werden? zu pickst dir einfach ein Beispiel raus, das am besten zu deiner Begründung passt..(das ist aber nur ein Sonderfall) Anders Beispiel: vorher werden 10000 Werte angezeigt (die wird man für die Darstellung irgendwie "komprimieren") nach dem zoomen sollen 100 dargestellt werden >Was soll dafür neu berechnet werden? praktisch alles, von der "Komprimierung", der Beschriftung, Min/Max werte usw. > Nein. Nur die Darstellung ändert sich. "nur" ein Histogramm IST die Darstellung http://de.wikipedia.org/wiki/Histogramm
:
Bearbeitet durch User
Rufus Τ. Firefly schrieb: > Nein. Nur die Darstellung ändert sich. Statt alle "Bins" von 0 bis 255 > darzustellen, werden nur noch die von z.B. 50 bis 100 dargestellt. eben nicht. Angenommen ich habe ein 12bit image und erzeuge ein Histogramm. meine Anzeige hat leider nur 1000 pixel, so dass 4 Bins auf jedes Pixel fallen. Was mache ich? Variante 1) ich zeige nur jedes 4. bin an -> blöd Variante 2) ich zeige das Maximum der vier Bins. Variante 3) ich berechne ein Histogrammbild und skaliere es einfach -> blöd Variante 4) ich erzeuge ein Histogramm, wo jeder Bin 4 breit ist. -> wahrscheinlich die beste Lösung. Zoome ich jetzt rein. zB mit Faktor 4 könnte ich aber doch 1er Bins darstellen. Ich habe jetzt die Wahl entweder das grobe Histogramm nur in der Darstellung zu verbreitern oder das Histogramm neuberechnen mit 1er Bins. Die Histogramme mit Binbreite 1 oder 4 unterscheiden sich natürlich
:
Bearbeitet durch User
Robert L. schrieb: > "nur" > ein Histogramm IST die Darstellung > http://de.wikipedia.org/wiki/Histogramm das stimmt nicht. Ein Histogramm ist in erster Linie ein Mittel für statistische Datenanalyse. Das Array mit den Werten ist das Histogramm, nicht nur dessen Darstellung auf dem Bildschirm
:
Bearbeitet durch User
Rufus Τ. Firefly schrieb: > Wozu? Es wird die Darstellung des Histogrammes gezoomt, nicht das > Quellmaterial. Also verändert sich das Histogramm nicht; warum also > sollte man es neu berechnen? Z.B. weil man sich ein Detail näher ansehen will, z.B. die genaue spektrale Verteilung um einen Peak herum - wenn man immer die gleiche Auflösung darstellt, ist Zoomen ja sinnlos. Etwa so wie wenn bei Google Maps nur die Strassen immer breiter würden. Du hast da wohl die falsche Vorstellung, man könnte vom ganzen Deutschland ohne Umrechnung auf den Potsdamer Platz zoomen, denn (deine Begründung) "Deutschland ändert sich ja beim Zoomen nicht". Das stimmt zwar, aber die Auflösung des Bildschirms ist halt nicht unendlich. Gruss Reinhard
Ich danke für die vielen Antworten. Wie ich sehe war ich wohl etwas unklar in meiner Fragestellung. Für das Histogramm habe ich einen Datensatz von bis zu 2.6 Millionen Werten. Ich dachte mir, ich können nun einmalig das Histogramm berechnen. Je nach Zoomstufe kann ich nun das Histogramm wie folgt anzeigen: -Maximal herausgezoomt -> Hier muss ich wohl Bins zusammenaddieren um nicht die maximale darzustellende Anzahl zu überschreiten. -Maximal hineingezoomt -> Anzeigen aller Bins innerhalb des Zoomfensters. So muss ich das Histogramm nur einmal berechen. Erscheint dies sinnvoll oder mache ich Denkfehler?
Reinhard Kern schrieb: > Z.B. weil man sich ein Detail näher ansehen will, z.B. die genaue > spektrale Verteilung um einen Peak herum - wenn man immer die gleiche > Auflösung darstellt, ist Zoomen ja sinnlos. Etwa so wie wenn bei Google > Maps nur die Strassen immer breiter würden. Ein Histogramm aber hat endlich definierte Stufen - bei einem 8-Bit-Bild gibt es nur 256 davon, und auch bei einem 16-Bit-Bild sind es nur 64 k, das nötigenfall jeweils pro Grundfarbe. Mehr Details sind da nicht.
JETZT hab ichs, der Rufus meint die Histogramme von Photos (also wie man sie auf DigiCams oder im PhotoShop sieht...) .... (das meint hier aber keiner, außer dir...)
GreenHorn schrieb: > -Maximal hineingezoomt -> Anzeigen aller Bins innerhalb des > Zoomfensters. Keine Ahnung was du unter maximal verstehst - für mich ist der maximale Zoom der, der einzelne Messwerte nebeneinander zeigt; dann braucht man nicht weiter zu zoomen (aber ev. interpolieren), weil nicht mehr Werte zur Verfügung stehen. Für alle Zoomstufen, bei denen die Zahl der angezeigten Werte grösser ist als die der horizontal angezeigten Punkte, musst du den Mittelwert von sovielen Werten bilden wie auf einen Bildschirmpunkt fallen. Bei beliebigen Zoomfaktoren gibt es nichts was du vorab berechnen könntest. Vertikal ist das was anderes, da werden ja alle Werte gleich skaliert, das kannst du vorab machen für eine bestimmte vertikale Zoomstufe, aber dann vorsichtshalber für alle Werte. Lohnt sich aber nicht unbedingt, weil du bei niedrigen Zoomstufen die Skalierung nur auf den Mittelwert anwenden musst. Also macht man das bei Bedarf. Gruss Reinhard
Robert L. schrieb: > der Rufus meint die Histogramme von Photos (also wie man sie auf > DigiCams oder im PhotoShop sieht...) Und selbst dann ist es falsch, wer sagt denn, dass so ein Histogramm nur 8 bit RGB anzeigt? Gruss Reinhard
>musst du den Mittelwert >von sovielen Werten bilden wie auf einen Bildschirmpunkt fallen. das kommt aber auch auf den Anwendungsfall an.. geht es um z.b. Wind, würde ich den Maximalwert nehmen, nicht den Durchschnitt (bzw. kann man ja auch min/mittelwert/max mit unterschiedliche Farben darstellen..)
Reinhard Kern schrieb: > Und selbst dann ist es falsch, wer sagt denn, dass so ein Histogramm nur > 8 bit RGB anzeigt? Mehr als das, was das Quellmaterial liefert, kann es nicht anzeigen. Wir sind hier nicht bei CSI.
Ich danke euch allen für die Antworten, ich denke mit disen Informationen kann ich mein Problem lösen. Liebe Grüsse GreenHorn
Rufus Τ. Firefly schrieb: > Mehr als das, was das Quellmaterial liefert, kann es nicht anzeigen. > > Wir sind hier nicht bei CSI. wer sagt denn, dass die Ausgangsdaten ein Bild sein müssen? oder sogar der Spezielle Bildtyp rgb 8bit, auf dem du so rumreitest?
:
Bearbeitet durch User
Vlad Tepesch schrieb: > wer sagt denn, dass die Ausgangsdaten ein Bild sein müssen? Sie sind es halt sehr oft. > oder sogar > der Spezielle Bildtyp rgb 8bit, auf dem du so rumreitest? Das mache ich doch überhaupt nicht, das ist einer von dreien, die ich als Beispiel verwendet habe.
Mich wundert, dass niemand mal nachfragt, wie lange die Berechnung des Histogramms (auch relativ zum Updaten der Anzeige) überhaupt dauert ... Ein einfaches Histogramm mit 2,6 Millionen ints und 10.000 Bins erzeugt mein Durchschnittsrechner knapp 500x pro Sekunde in einem Thread - um nur mal eine Hausnummer zu nennen. Selbst bei einer lahmen Möre dürfe es bei vielleicht 10 Updates/s beim Zoomen keine Rolle spielen. Dazu kommt noch, dass das Umgehen der Neuberechnung - sofern möglich - wiederum mit Berechnungen verbunden ist ... Natürlich kommt es auf die Details der Daten und des Histogramms an, aber man sollte erst einmal feststellen, ob überhaupt ein Problem existiert, bevor man Zeit & Arbeit in die Lösung eines Pseudo-Problems investiert. Darum erst messen und erst dann - falls sinnvoll - optimieren.
Korrektur: 250x. Aber das ist hier ziemlich egal. Wie gesagt: Selbst mit realistischen Daten messen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.