Autor |
Beitrag |
klezmor
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Sa 25.12.10 02:58
Hallo ich habe jetzt 30min bei google gesucht um ne funktion zu finden, die mir eine gegebene temperatur sagen wir mal zwischen -10 und 100 grad in einen RGB-Wert umwandelt, damit ich die temperatur durch eine bestimmte temperatur illustrieren kann, also so wie man die temperatur intuitiv erkennt wie z.b. beim wetter oder so.
Rot heiß weiß ganz heiß violett kalt.
Hoffentlich weiß jemand von euch Rat.
Gruß Klezmor und ne frohe weihnacht wünsche ich euch auch.
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 25.12.10 03:14
Nun ja, wie du welche Temperatur darstellen willst, musst du dir ja überlegen, das machen die beim Wetter ja auch nicht alle gleich.
Aber ich denke da kommst du mit dem HSB bzw. HSV Farbraum besser hin als mit RGB:
www.delphipraxis.net...hsv-und-hsv-rgb.html
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Sa 25.12.10 23:26
hi danke, dies so zu tun, hatte ich mir auch schon überlegt, aber das ist einfach zu aufwenig, es müsste ja auch einfach eine funktion geben, die das direkt für den rgb-raum tut.
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 25.12.10 23:44
Was du natürlich machen kannst, ist ganz gewöhnliche lineare Interpolation.
Dazu musst du dir hier 3 Stützpunkte definieren:
0° -> Blau ($FF0000)
50°-> Rot ($0000FF)
100°->Weiß ($FFFFFF)
Um jetzt zwischen 2 Punkten zu interpolieren, zerlegst du die Farbe per GetR/G/BValue in die Farbkanäle und rechnest ganz normal (Schulmathe oder ggf Google) für jeden Kanal die Werte aus. Dann die 3 Ergebnisse per RGB() wieder verrühren - Fertig.
In HSV geht das teilweise schöner und mit wesentlich weniger Stützpunkten, da musst du in RGB etwas mehr Hirnschmalz reinstecken. Aber das Prizip ist das selbe.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 26.12.10 00:44
Wobei ich die 3 stützpunkte dynamisch machen würde. Also unterer stützpunkt ist die niedrigste gemessene temperatur im bild die gemessen wird, oberer die höchste im bild und der rest wird berechnet. Und dann halt ne skala dazu angeben.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Für diesen Beitrag haben gedankt: Martok
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 26.12.10 22:15
Beispiel in C++:
www.anmabagima.de/DXCpp/ddrawV2.html
oder so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| var ColTab2 : Array [0..255] of Cardinal;
Procedure MakeTab; var i : Integer; r,g,b : Byte; BEGIN for i:= 0 to 255 do Begin r:= 0+i; if i<128 then g:=i * 2 else g:=g - 2; b:=255-i; ColTab2[i]:= RGB(r,g,b); End; END;
Anwendungsbeispiel: for i:= 0 to 255 do BEGIN Panel1.color:= ColTab2[i]; Label1.caption:= IntToStr(i)+' = '+ IntToStr(ColTab2[i]); Application.processmessages; Sleep(100); END; |
Einloggen, um Attachments anzusehen!
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Fr 07.01.11 12:26
Danke für die Antworten, was ich eigentlich gerne hätte wäre eine Skalierung wie in diesem Bild: www.temperaturbild.d...d2007/1-Gebaeude.JPG
ich denke so etwas ist beinahe standard, wie man erkennen kann nutzt derjenige, der das bild erstellt hat jedoch nicht direkt den hsv-raum, sonst sähe das bild anders aus.
Ich hätte gedacht, dass der algorithmus für eine solche skala praktisch immer der gleiche ist, weshalb ich auch nicht selbst sonderlich viel zeit damit verbringen möchte, das rad neu zu erfinden. Ich habe schon gegoogelt aber leider nichts dazu gefunden.
Vielleicht hat ja doch noch jemand nen link oder ne vorstellung wie das funktioniert.
gruß Klezmor.
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 07.01.11 12:45
Die Farbtabelle im Beispielbild ist willkürlich erzeugt und soll menschliches Temperaturempfinden farblich nachbilden.
Ausserdem nimmt man kontrastreiche Farben, um geringe Temperaturunterschiede deutlich hervorzuheben.
Die Skala am rechten Rand entspricht ziemlich genau der von mir erzeugten Farbtabelle.
Wo Du dann die Temperaturen zuordnest, bleibt Dir überlassen.
Beispiel:
0 °C = ColTab2[255]
25,5 °C = ColTab2[0]
Man muss auch nicht die ganze Tabelle nutzen, sondern kann sich auf einen farblich interessanten Bereich beschränken,
z.B. könnte man den Temperaturbereich zwischen 0°C und 5°C spreizen auf die halbe Tabelle usw.
Aber wenn man keine Phantasie hat...
Zuletzt bearbeitet von hathor am Fr 07.01.11 12:55, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 07.01.11 12:46
Wenn ich das in dem Bild auf die Schnelle richtig sehe, ist das relativ einfach im HSV Raum nachzubilden. Der Farbton rotiert durch, die Helligkeit nimmt nach unten etwas ab und die Sättigung bleibt etwa konstant.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Fr 07.01.11 13:55
klezmor hat folgendes geschrieben : | ....wie man erkennen kann nutzt derjenige, der das bild erstellt hat jedoch nicht direkt den hsv-raum, sonst sähe das bild anders aus. |
Jein. An solchen Messgeräten stellt man das Raster ein, wie die Auflösung sein soll(siehe den rechten Rand des Bildes) Dadurch ergibt sich das Bild auch so.
hathor zeigt Dir nur den liniaren Verlauf ohne Raster.
Das Bild würde sonst sehr unsauber aussehen und man hätte keine relativ scharfen Übergänge bei der Tempanzeige im Bild.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Fr 07.01.11 15:16
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Fr 07.01.11 16:05
Ob ich es richtig erklären kann mh....
Ich versuche es
Wenn Du das Raster anschaust, siehst du etwa 24 Farbtöne aus den gesamten Farbspektrum, was hathor gemacht hat. Würde man die Auflösung verfeinern, z.B. 128 Farbtöne, bekommt man weichere Farbübergänge. Was aber nicht der Sinn bei diesem Verfahren ist und das Bild evtl verfälscht.
Feinere Auflösungen macht man dann z.B. im Raum, Fenster/Wand, um zu testen wie die Isolierung ist usw.
Je grösser also der Temp unterschied ist, um so grobber muss die Darstellung gemacht werden um solch ein Bild zu erhalten!
Hoffe das ich es in etwa richtig erklären konnte.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Fr 07.01.11 16:27
Also ich hoffe ihr versteht was ich meine diese Skalierung ist doch absolut gebräuchlich und wird doch nicht von jedem Programmierer neu definiert wenn egal ob ich die wetternachrichten schaue oder ein wärmebild, es ist immer eine ähnliche Skalierung die dem Menschen sinnvoll erscheint.
Ich habe es nun doch mit dem HSV-Raum versucht, aber es scheint nicht zu funktionieren, ich weiß allerdings nicht an was es liegen könnte, hat jemand eine ahnung? Hier mein Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| void convertHSV2RGB(float h, float s, float v, int &r, int &g, int &b){ if (h == 360.0) h=0.0; float f = h / 60; float i = (float) floor((double)f); int p1 = (int) (v * (1.0 - s) * 255); int p2 = (int) (v * (1.0 - f * s) * 255); int p3 = (int) (v * (1.0 - (1.0 - f) * s) * 255); switch( (int)i) { case 0: { r = v; g = p3; b = p1; }break; case 1: { r = p2; g = v; b = p1; }break; case 2: { r = p1; g = v; b =p3; }break; case 3: { r = p1; g = p2; b = v; }break; case 4: { r= p3; g= p1; b =v; }break; case 5: { r=v; g=p1; b=p2; }break; } } |
normal müssten doch feine farbverläufe zu erkennen sein,aber die farbe springt bei einem wert von h von 0-360 immer wieder auf 0. als sättigung und value gebe ihc einfach 1.0 an. Gelb entsteht zum beispiel gar nicht, dafür springt die farbe von knallrot nach knallgrün.
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Sa 08.01.11 12:23
Warum verwendest du nicht den link den hathor gepostet hatt und baust darauf auf!?
Was macht die Caseanweisung, irgendwie nicht verständlich für mich?
Aber bei C(# ++) und alles was bestimmten Allgoritmus unterliegt muss ich eh passen.
Da müssen Dir andere Helfen,
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Sa 08.01.11 13:45
Hi,
woran es liegt, dass der Code nicht das macht, was er soll, kann ich Dir leider auch nicht sagen, da ich mit C++ nicht wirklich viel Ahnung habe.
Aber habe mal eine interessante Bibliothek gefunden: www.koders.com/cpp/f...DEFD2F.aspx?s=opencv
Dort sie die Funktion so aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| void hsv2rgb(float h, float s, float v, float &r, float &g, float &b) { // See: http://en.wikipedia.org/wiki/HSV_color_space h = max(0.0f, min(1.0f,h)); s = max(0.0f, min(1.0f,s)); v = max(0.0f, min(1.0f,v));
int Hi = ((int)floor(h *6)) % 6; float f = (h*6) - Hi; float p = v*(1-s); float q = v*(1-f*s); float t = v*(1-(1-f)*s);
switch (Hi) { case 0: r=v; g=t;b=p; break; case 1: r=q; g=v;b=p; break; case 2: r=p; g=v;b=t; break; case 3: r=p; g=q;b=v; break; case 4: r=t; g=p;b=v; break; case 5: r=v; g=p;b=q; break; } } | Vielleicht hilt Dir das ja weiter
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 08.01.11 14:12
Eine wichtige Information wäre: in welchem Bereich liegen die Werte von h, s und v vor?
Normalerweise wird bei float-Werte ja dann 0.0 bis 1.0 angenommen.
klezmor scheint jedoch Grad bzw. Prozentwerte zu benutzen (d.h. 0 - 360 bzw. 0 - 100). Und daher passen dann natürlich seine verwendeten Formeln nicht...
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Mo 10.01.11 18:33
Entspricht mein Code nicht genau dem, von Trashkid2000?
H übergebe ich in einem Wertebereich von 0-360, denke hierfür ist der Algorithmus auch ausgelegt.
Für S und V übergebe ich immer 1.0, da ich genau diese starken Farben haben möchte.
Ich erwarte, dass dann r,b, und b mit werten zwischen 0 und 255 gefüllt werden, aber dem ist leider nciht so.
Wenn ich H von 0-360 laufen lasse gibt es keinen "smoothen" Farbübergang, sondern es sind extreme Farbsprüunge drin, die Farbe Gelb müsste ja eigentlich bei h=60.0 erscheinen.
Aber gelb erscheint gar nicht. An Rundungsfehlern dürfte es doch auch nicht scheitern oder?
Gruß Klezmor.
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 10.01.11 19:00
Hi klezmor,
der Code von dir und Trashkid wäre dann gleich, wenn dein 'h' auch den Wertebereich von 0 bis 1 hätte
Sonst rechne mal von Hand bei dir nach, was für Werte du erhältst, wenn 'h' von 0 bis 360 geht.
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Mo 10.01.11 19:20
Ja das stimmt aber es ging mir eher darum, dass der Algorithmus richtig implementiert ist und da denke, ich dass mein code korrekt funktionieren sollte, was er leider nicht tut. Die richtige Skalierung ist das kleinste Problem.
gruß Klezmor.
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|