Seite 1 von 1

[solved] Werteliste zu Bild verarbeiten

Verfasst: 25. Juli 2015 20:02
von Lundgrolf
Hey Ho,

Ich habe eine riesen Liste (~500'000) mit x,y,z Werte und würde die gerne irgendwie zu einem Bild verwursteln, dass die z-Werte vorerst erstmal ruhig in Graustufen dargstellt werden. Die Nähe der Datenpunkte sollte eigentlich auch ausreichen um einzelne Pixel zu bestimmen. Mein Problem ist nun, dass bei meinem Beispiel, was ich mir irgendwie ausn Internet zusammengebastelt habe es nicht klappt. Wie könnte man denn das Problem lösen?

Erfolgloses Beispiel:

Code: Alles auswählen

      QImage bild(w,h,QImage::Format_Invalid);
      QColor inten(255,255,255,255);
      for(int i=0;i<m;i++){
          if(daten[i][2]>1) {
               inten.setBlue((int)255*log10(daten[i][2])/log10(ni));
               inten.setGreen((int)255*log10(daten[i][2])/log10(ni));
               inten.setRed((int)255*log10(daten[i][2])/log10(ni));
          }

         bild.setPixel((int)(abs(daten[i][1])-abs(nl))*w/(abs(ml)-abs(nl)),(int)(abs(daten[i][0])-abs(nh))*h/(abs(mh)-abs(nh)), inten.rgba());

         ui->progressBar->setValue(i);
         QCoreApplication::processEvents(QEventLoop::AllEvents);
      }
      ui->label_bild->setPixmap(QPixmap::fromImage(bild));

Re: Werteliste zu Bild verarbeiten

Verfasst: 27. Juli 2015 00:23
von veeman
Was genau geht den nicht?

Re: Werteliste zu Bild verarbeiten

Verfasst: 27. Juli 2015 13:13
von Lundgrolf
Naja mit der Methode kriege ich nur ein weißes Bild.

Re: Werteliste zu Bild verarbeiten

Verfasst: 27. Juli 2015 14:08
von RHBaum
Naja hier den Fehler zu suchen ist mühsam :-)
und der code ist schrecklich, hoffe den hasst wirklich nur abgekupfert :-)

Code: Alles auswählen

inten.setBlue((int)255*log10(daten[i][2])/log10(ni));
1. 1000 mal an die tafel schreiben: "C-Style Casts in C++ sind böse!"
2. (int)255 ist witzlos, das literal 255 ist eh nen int
3. sicher das log10 hier die richtige funktion ist .... ich kenne die daten nicht, aber sicherder Grauwert 255 * log_ni (daten[2]) sein sollte ? was soll das ni sein?

bild.setPixel((int)(abs(daten[1])-abs(nl))*w/(abs(ml)-abs(nl)),(int)(abs(daten[0])-abs(nh))*h/(abs(mh)-abs(nh)), inten.rgba());

1. warum das "abs" überall ? selbst wenn die daten signed sind, sollte in den daten schon ein unterschied zwischen -10 und 10 sein, und nicht einfach das vorzeichen abschneiden ^^ Irgendwie glaub ich ned das das gewollte effekte erzielt ...
2. daten[1] * w wie width und daten[0] * h wie height ? setpixel die param positionen stimmen dazu ... aber in deinen daten ist das data.[index].[0] der Y-wert ? und data.[index].[1] ist der X Wert ? ist das richtig ?

wer ist der "Designer" von data[index][xyz] ??? Hasst du da einfluss drauf ?
das mehrdimensionale array ist hier echt schwer leserlich und unelegant designt.
Besser wäre sowas wie ein Array of struct oder typedefs

BTW in der 3d programmierung hasst dafür fertige Typen / typedefs

noch ne Anmerkung:
3d programmierung ist "komplett anders" als 2D. es macht nicht viel sinn erst mal 2D und bitmaps zu arbeiten, und dann auf 3D zu erweitern.
Es sei denn:
- du willst eh auch bitmaps lernen
- du willst die daten in 3d nur als textur reinbringen
- du willst erstmal ohne grossen aufwand die Daten auf plaussibilitaet prüfen und hoffst das da was siehst ^^

ciao ...

Re: Werteliste zu Bild verarbeiten

Verfasst: 27. Juli 2015 14:47
von Lundgrolf
Es soll ein Konturplot (3D wäre schrecklich für diese Probleme) werden mit log10 Skala. ni ist dabei halt der maximale Wert --> 0 bei 0 Intensität und beim maximalen halt 255

Das mit den abs habe ich nur gemacht, dass ich mir total sicher sein kann, dass ich einen Wert zwischen 0 und w bekomme. Ob es danach nicht gespiegelt oder so dargestellt wird, hat mich zu dem Zeitpunkt auch noch relativ wenig interessiert, wollte halt einfach nur, dass es irgendwie klappt.

Die Datensätze kriege ich einfach geliefert und muss die dann verwursten, habe also nur beim Einlesen ne Möglichkeit was praktischeres zu definieren. Bin auch der Meinung elegant gibts erst, wenn das Grundproblem gelöst ist.

Beispiel aus Datensatz:

Code: Alles auswählen

y             x         "z"
2,8847E0 -8,9343E-1 1,3667E1
2,8847E0 -8,9236E-1 1,7667E1
2,8847E0 -8,9129E-1 1,8167E1
2,8847E0 -8,9022E-1 1,4167E1
2,8847E0 -8,8915E-1 1,45E1
2,8847E0 -8,8807E-1 1,4667E1
2,8847E0 -8,87E-1 1,1667E1
2,8847E0 -8,8593E-1 1,2333E1
2,8847E0 -8,8486E-1 1,15E1
2,8847E0 -8,8379E-1 1,0333E1
2,8847E0 -8,8272E-1 1,0667E1
2,8847E0 -8,8164E-1 1,45E1
2,8847E0 -8,8057E-1 1,65E1

Re: Werteliste zu Bild verarbeiten

Verfasst: 27. Juli 2015 17:36
von Lundgrolf
Okay...Gefunden...lag am Format und an dem (int) bei den Pixeln

Re: [solved] Werteliste zu Bild verarbeiten

Verfasst: 28. Juli 2015 09:54
von RHBaum
ni ist dabei halt der maximale Wert --> 0 bei 0 Intensität und beim maximalen halt 255
Ahh ok, damit erklärt sich einiges ...
Ob es danach nicht gespiegelt oder so dargestellt wird, hat mich zu dem Zeitpunkt auch noch relativ wenig interessiert, wollte halt einfach nur, dass es irgendwie klappt.

Ok, aber in der Praxis ists eher üblich solche werte dann zu verwerfen, zumindest für die grafik, und die irgendwo anders anzumosern, meist im log dann. Deswegen etwas verwirrt.
Bin auch der Meinung elegant gibts erst, wenn das Grundproblem gelöst ist.
Da bin ich komplett anderer Meinung ^^
Es gibt Dinge, die kosten (fast) nix, bringen aber fürs programmieren enorm viel .... die sollten für einen Programmierer ins Blut übergehen.
Und grad auch in der Entwurfs, bzw. Prototy Phase zahlt sich übersichtlicher und leicht zu verstehender Code enorm aus.

konkrete Beispiele für deinen Fall:
statt mehrdimansionale arrays, nen eindimensionales Array mit spezialtyp. kostet fast nix, auch nicht an programmieraufwand. Aber schreib das mal um, und verwende dann eher so ne syntax data.x , statt data[1] ...
Dein Fall bietet sich qausi voll dafuer an. Und vergleich den code mal hinterher in Bezug auf "Verstandlichkeit"

bild.setPixel((int)(abs(daten[1])-abs(nl))*w/(abs(ml)-abs(nl)),(int)(abs(daten[0])-abs(nh))*h/(abs(mh)-abs(nh)), inten.rgba());

das zum beispiel auch nen Musterbeispiel für eher unverständlichen code ^^
splitte mehr auf, arbeite mit inline funktionen/methoden, die kosten nix, aber bringen viel mehr Übersicht .....

Der Effekt ist, Fehler die jeder unabdingbar auch macht, findet man viel schneller ^^
Wenn andere über deinen code schauen sollen/müssen ....
Wie gesagt, das sollte ins blut übergehen ... es gibt effektiv keinen Grund so spaghetti code zuerst zu produzieren und dann zu korrigieren.
Wär genau so bescheuert wie zuerst wild variablennamen zu verwenden und dann später erst auf den Standard zu korrigieren, wenn man den vorher schon weiss ....

Bei dingen die (richtig) ZEIT kosten .... also Profiling für performance, grafischen schnickschnack, etc, klar den verschiebt man nach hinten ....

Aber toll wenns nu klappt ^^

Ciao ...