Forum: PC-Programmierung Zoomverhalten eines Histogramms


von GreenHorn (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Robert L. (lrlr)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Vlad T. (vlad_tepesch)


Lesenswert?

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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Robert L. (lrlr)


Lesenswert?

da jeder unter
"Histogramm", "Anzeige", "neu Berechnen", "neu durchs
Bild laufen"

was anders Versteht/Meint

werden wir wohl auf keine grünen Zweig kommen...

von Robert L. (lrlr)


Lesenswert?

>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
von Vlad T. (vlad_tepesch)


Lesenswert?

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
von Vlad T. (vlad_tepesch)


Lesenswert?

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
von Reinhard Kern (Gast)


Lesenswert?

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

von GreenHorn (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Robert L. (lrlr)


Lesenswert?

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

von pks (Gast)


Lesenswert?


von Reinhard Kern (Gast)


Lesenswert?

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

von Reinhard Kern (Gast)


Lesenswert?

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

von Robert L. (lrlr)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von GreenHorn (Gast)


Lesenswert?

Ich danke euch allen für die Antworten, ich denke mit disen 
Informationen kann ich mein Problem lösen.

Liebe Grüsse GreenHorn

von Vlad T. (vlad_tepesch)


Lesenswert?

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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von manni (Gast)


Lesenswert?

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.

von manni (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.