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.
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
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
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
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.
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?
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.