Autor Beitrag
klezmor
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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



BeitragVerfasst: So 26.12.10 22:15 
Beispiel in C++:

www.anmabagima.de/DXCpp/ddrawV2.html

oder so:
ausblenden 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..255of Cardinal;

Procedure MakeTab; //Farbtabelle erzeugen
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Fr 07.01.11 13:55 
user profile iconklezmor hat folgendes geschrieben Zum zitierten Posting springen:
....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.
user profile iconhathor 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Fr 07.01.11 15:16 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Dadurch ergibt sich das Bild auch so.
user profile iconhathor 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

das verstehe ich nicht ganz.

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Fr 07.01.11 16:05 
Ob ich es richtig erklären kann mh....
Ich versuche es :wink:
Wenn Du das Raster anschaust, siehst du etwa 24 Farbtöne aus den gesamten Farbspektrum, was user profile iconhathor 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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:
ausblenden volle Höhe Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 08.01.11 12:23 
Warum verwendest du nicht den link den user profile iconhathor 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, :oops:
Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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