Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   ähnlichkeit von Farben - in eine Farbe wandeln (https://www.delphipraxis.net/195747-aehnlichkeit-von-farben-eine-farbe-wandeln.html)

bernhard_LA 21. Mär 2018 21:50

ähnlichkeit von Farben - in eine Farbe wandeln
 
auf einem Foto z.B. von einem gelben Gegenstand sieht man ja nicht nur einen gelben Farbwert sondern ein ganzes Spektrum von gelben Farbtönen.

ich benötige jetzt eine Funktionen die alle gelben Farbtöne in eine einheitliche Farbe meiner Wahl konvertiert.

Gibt es hier schön Lösungen für dieses Problem

stahli 21. Mär 2018 22:03

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
Ich hatte mal einiges zur Helligkeitsänderungen zusammengetragen: https://www.delphipraxis.net/88775-f...eraendern.html
Vielleicht kannst Du in der Richtung mal etwas stöbern...?

TigerLilly 22. Mär 2018 08:08

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
Farbe in RGB umwandeln
https://www.delphipraxis.net/33268-t...-zerlegen.html

Mit 3d Arithmetik den Abstand bestimmen:
http://www.mathematik-oberstufe.de/v...-2p-in-r3.html

Alle Punkte mit Abstand < Schwellenwert sind "ähnlich".

Neutral General 22. Mär 2018 08:17

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
Mit RGB ist das unnötig schwer.

Du solltest deine Farben in den HSL- oder HSV-Farbraum konvertieren. Da kannst du dann den H(ue)-Wert (Das ist quasi die Farbe) einfach verändern und in RGB zurückwandeln.
Dann hast du die Farbe geändert, aber die Helligkeit und Sättigung beibehalten.

Amateurprofi 22. Mär 2018 08:32

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
Zitat:

Zitat von Neutral General (Beitrag 1396947)
Mit RGB ist das unnötig schwer.

Du solltest deine Farben in den HSL- oder HSV-Farbraum konvertieren. Da kannst du dann den H(ue)-Wert (Das ist quasi die Farbe) einfach verändern und in RGB zurückwandeln.
Dann hast du die Farbe geändert, aber die Helligkeit und Sättigung beibehalten.

Richtig!
Jedoch sollte man beachten, dass bei sehr geringer Sättigung alle Farben grau aussehen, wobei "grau" irgend etwas zwischen schwarz und weiß ist. Vielleicht sollte man statt "grau" den Begriff "farblos" verwenden.
Auch sollte beachtet werden, dass bei sehr geringer Helligkeit alle Farben schwarz aussehen.
Somit ist der Hue-Wert nicht das alleinige Kriterium.

Neutral General 22. Mär 2018 08:56

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ist nicht perfekt aber man muss halt etwas mit den Zahlen spielen:
Edit: Auf dem Thumbnail sieht es richtig gut aus, man darf nur nicht genau hingucken :mrgreen:
Edit2: Beim Blauen hab ich nochmal etwas besser angepasst (zumindest was die Vasen selbst angeht - gibt leider immer noch etwas Kollateralschaden :mrgreen:)

Der schöne Günther 22. Mär 2018 09:10

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
Ich weiß nicht inwiefern das hier noch eine Rolle spielt, aber die subjektiv empfundene Helligkeit hängt auch von der Farbe ab. Ich weiß schon gar nicht mehr wo das bei mir zum Einsatz kommt, aber ich habe noch das hier gefunden:

Delphi-Quellcode:
uses Vcl.Graphics, Winapi.Windows;

type
   TColorHelper = record helper for Vcl.Graphics.TColor
      public function getPerceptiveLuminance(): Single;
   end;

function TColorHelper.getPerceptiveLuminance(): Single;
begin
   Result := // Nach https://en.wikipedia.org/w/index.php?title=Relative_luminance&oldid=634803879
      GetRValue(self) * 0.2126
      + GetGValue(self) * 0.7152
      + GetBValue(self) * 0.0722;
end;

bernhard_LA 22. Mär 2018 15:53

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
mich würde der Code zum Vasenbild interessieren ? Machbar ?

Neutral General 22. Mär 2018 16:22

AW: ähnlichkeit von Farben - in eine Farbe wandeln
 
Klar kann ich machen. Weil ich keine Lust hatte die Farbkonvertierung selbst zu schreiben (warum ist sowas nicht schon in Delphi drin? :() habe ich mir für die Konvertierung schnell was zusammengegoogelt, von daher keine Garantie auf den Teil:

Code zum Konvertieren von RGB<->HSB (HSL, HSV, HSB.. Alle mehr oder weniger das Gleiche, Hue ist das was wir in erster Linie brauchen und das ist überall gleich):
https://codereview.stackexchange.com...b-cmyk-and-hsv

Mein Code (Nur hässlicher Testcode für Inspiration, keine Copy&Paste-Qualität :mrgreen:)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var bmp: TBitmap;
    rgb: PRGBQuad;
    i,j: Integer;
    tmpColor: TColorRec;
begin
  bmp := TBitmap.Create;
  try
    bmp.Assign(Image1.Picture.Bitmap);
    bmp.PixelFormat := pf32bit;
    for i := 0 to bmp.Height-1 do
    begin
      rgb := bmp.ScanLine[i];
      for j := 0 to bmp.Width-1 do
      begin
        tmpColor := TColor(rgb^);
        // 175-190 ca. sind Gelbtöne. Und wenn mit einem Schwellenwert für die Sättigung kann man noch ein paar Graus rausfiltern
        if ((tmpColor.Hue >= 175) and (tmpColor.Hue <= 190)) and (tmpColor.Saturation > 0.15) then
        begin
          // Bei SetHue erwartet er komischerweise Werte von 0.0-1.0 statt 0-360..
          // Mit SetHue wird nur der Farbton geändert, Sättigung und Helligkeit bleiben
          // Kannst dir da nen Wert zwischen 0 und 1 aussuchen:
          tmpColor.SetHue(0.1);
          rgb^ := TRGBQuad(TColor(tmpColor));
        end;
        inc(rgb);
      end;
    end;

    Image2.Picture.Bitmap := bmp;
  finally
    bmp.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz