Farbähnlichkeit zweier RGB-Werte ermitteln

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Kaeru Gaman hat geschrieben:also die 16 grundfarben plus 16 grautöne?

... da würde ich vielleicht noch eher konkret spezialisieren anstatt groß zu vergleichen.
du hast da ja im grunde nur die sechs spektralfarben in zwei helligkeiten, und der rest sind grautöne, oder?

wenn deine Pics mehr als 32² groß sind, solltest du wohl auch eher dithern...

gibts für genau so nen zweck - import von bildern auf die alten 32 farben -
nicht vielleicht irgendwelche werkzeuge auf DOS-freaks seiten oder so?
Die Pics sind exakt 32x32. Naja das Problem ist das da auch mit allen möglichen Tricks gearbeitet wurde in dem Spiel um die Farblimits zu umgehen. Die 32 Farben sind Teil einer 256 Farbpalette. Allerdings variieren alle Farben bis auf diese 32, jeh nach Situation. Möglicherweise variieren auch diese 32, wenn man auf einem Bildschirm ohne dargestellte Charakterportrais ist.

Aber mit Stargates Variante funzt das super! :allright:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Das Spiel werden vermutlich manche hier kennen. Ein hochklassiges Rollenspiel aus deutschen Landen. ;)

Das Bild was ich zum Test importiert habe:
Bild

Das Bild konvertiert und importiert mit meiner + gnasens Methode:
Bild

Das Bild konvertiert und importiert mit Stargates Methode:
Bild

Unten Links ist das Portrai.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Code: Alles auswählen

Macro QuadDistance(X1,Y1,Z1, X2,Y2,Z2)
  ( (X1-X2)*(X1-X2) + (Y1-Y2)*(Y1-Y2) + (Z1-Z2)*(Z1-Z2) )
EndMacro

Macro DistanceRGB(Color1, Color2)
 QuadDistance(Red(Color1),Green(Color1), Blue(Color1), Red(Color2),Green(Color2), Blue(Color2))
EnddMacro
Nimm besser sowas, das andere ist unnötig langsam du willst die Werte ja nur vergleichen da ist es egal ob sie quadriert sind.

Edit: fehlende Klammer gesetzt
Zuletzt geändert von Batze am 21.09.2008 00:26, insgesamt 1-mal geändert.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

klar ist es schneller

nur wenn er die Quadrate vergleich ... dann würde er folgendes Beispiel erhalten:

Quadrate:
4 <-> 25 => 21
25 <-> 49 => 24

gewurzelt
2 <-> 5 => 3
5 <-> 7 => 2

bei deinem wäre also das erste bevorzugt, bei meinem das zweite ...

weiß nun nicht ob das für das Ergebnis schädlich ist ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

STARGÅTE hat geschrieben:nur wenn er die Quadrate vergleich ... dann würde er folgendes Beispiel erhalten:

Quadrate:
4 <-> 25 => 21
25 <-> 49 => 24

gewurzelt
2 <-> 5 => 3
5 <-> 7 => 2

bei deinem wäre also das erste bevorzugt, bei meinem das zweite ...
Nein, es würden niemals unterschiedliche Ergebnisse entstehen, du hast meine Funktion falsch berechnet. Es kommt exakt das quadrierte Ergebnis herraus.

(2 <-> 5)² => 9
(5 <-> 7)² => 4
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

du hast jetzt mein beispiel falsch angewendet...
wollte auf was anderes hinaus...

deine Werte sind natürlich genau die Quadrate meiner Werte ... ist ja logisch wenn man keine wurzel zieht...

wenn ich ein passenderes Beispiel finde, schreib ich es ...
solange kann ja Thorium mal testen ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

STARGÅTE hat geschrieben: wenn ich ein passenderes Beispiel finde, schreib ich es ...
solange kann ja Thorium mal testen ...
Heute nicht mehr. Optimierung kommt morgen drann. Bin nur erstmal froh das es jetzt so gut geht. Zumal Performance dabei eher nebensächlich ist. Sind ja grad mal 1024 Pixel die da durchgeakert werden.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

STARGÅTE hat geschrieben:du hast jetzt mein beispiel falsch angewendet...
wollte auf was anderes hinaus...
Ok, dann kann dein Vergleich nur bedeuten, dass du fertige Werte vergleichst die bei der jeweiligen Funktion herauskommen. Wann tut man das denn? Aber klar, willst du mehr damit machen als Vergleichen musst du aus meinem Wert die Wurzel ziehen, schon richtig.

Und @Thorium, dann benutz wenigstens Makros und setz um mein "QuadDistance(...)" ein "Sqr(...)", ist dann immernoch viel schneller und ändern musst du dann im Code auch nichts außer Stargates Funktion durch meine ersetzen). :mrgreen:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
LCD
Beiträge: 107
Registriert: 23.01.2008 13:13
Wohnort: Wien

Beitrag von LCD »

Makros dürften zwar etwas schneller sein, aber die Performace ist bei 1024 Pixeln vernachlässigbar.
Meine Routine schaut so aus:

Code: Alles auswählen

Procedure RGBdistance(col1,col2)
  rd=col1&255-col2&255: gd=col1>>8&255-col2>>8&255: bd=col1>>16&255-col2>>16&255
  ProcedureReturn Sqr(rd*rd+gd*gd+bd*bd)
EndProcedure
Sie arbeitem mit zusammengesetzten RGB-Werten wie die von STARGÅTE. Ich benutze sie beim Retro-X und bekomme damit bei jeder Konversion, egal ob Amiga HAM6, C64 oder SAM Coupé immer hervorragende Ergebnise, sofern eine gut gefächerte Palette zur Verfügung steht.
PB 4.61Beta1 32/64Bit. AMD FX6100, 8 GB RAM, ATI Radeon 5750, Win7 64 (64 bit ist mist weil 16-Bit Programme wie MakeTZX nicht mehr darauf funktionieren).
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Nimm LCDs, das ist wahrscheinlich sogar noch schneller weil er sich die Red/Green/Blue-Aufrufe spart.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Antworten