[solved] Werteliste zu Bild verarbeiten

Alles rund um die Programmierung mit Qt
Antworten
Lundgrolf
Beiträge: 4
Registriert: 4. Februar 2015 22:02

[solved] Werteliste zu Bild verarbeiten

Beitrag 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));
Zuletzt geändert von Lundgrolf am 27. Juli 2015 17:36, insgesamt 1-mal geändert.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Werteliste zu Bild verarbeiten

Beitrag von veeman »

Was genau geht den nicht?
Lundgrolf
Beiträge: 4
Registriert: 4. Februar 2015 22:02

Re: Werteliste zu Bild verarbeiten

Beitrag von Lundgrolf »

Naja mit der Methode kriege ich nur ein weißes Bild.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Werteliste zu Bild verarbeiten

Beitrag 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 ...
Lundgrolf
Beiträge: 4
Registriert: 4. Februar 2015 22:02

Re: Werteliste zu Bild verarbeiten

Beitrag 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
Lundgrolf
Beiträge: 4
Registriert: 4. Februar 2015 22:02

Re: Werteliste zu Bild verarbeiten

Beitrag von Lundgrolf »

Okay...Gefunden...lag am Format und an dem (int) bei den Pixeln
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: [solved] Werteliste zu Bild verarbeiten

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