Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Farbmittelwert (https://www.delphipraxis.net/170781-farbmittelwert.html)

Jonas Shinaniganz 3. Okt 2012 00:28

Farbmittelwert
 
Ich habe jetzt ein bisschen in der DP geschnüffelt und fand die "kleine_version_129.exe" von "Auenkrebs" sehr amüsant. Leider hilft mir das nicht so wirklich weiter.

Mein Anliegen ist es, eine Anzahl Pixel in einem Bitmap im Farbwert zu mitteln. Sowas wie,

http://graphics32.org/documentation/...lorAverage.htm

nur mit einem "Rechteck" von Pixeln auf meinem Bitmap.

Aus diesem Mittelwert möchte Ich dann mit einer variablen Toleranz in Prozent alle Pixel auf dem Bild ausfindig machen. Die Pixel, welche in den Tolleranz Bereich fallen, werden dann zum Beispiel schwarz gezeichnet.

Wenn man im Photoshop mal den "Zauberstab" benutzt, kommt es meinen Vorstellungen schon sehr nahe, nur das keine Pixel selektiert werden sollen.

Hat jemand Erfahrung, wie man da vorgeht?

Grüße und eine schönen freien Tag.

himitsu 3. Okt 2012 00:56

AW: Farbmittelwert
 
Und was genau ist denn nun das Problem?

Laut deiner total aussagefähigen Überschrift: "Wie berechnet man einen Mittelwert?", bzw. "Woraus besteht ein RGB-Farbwert?".
Antwort: Fra mal deinen Mathelehrer, warum er es die nicht beigebracht hat oder schau bei Wiki.



- Wie geht man alle Pixel in einem vorgegebenem Bereich (Rechteck) durch? (1-2 Schleifen)

- Wie zerlegt man einen Farbwert? (RGB, Delphi-Referenz durchsuchenGetRValue usw.)

- Wie berechnet man einen Mittelwert aus mehreren Werten. (jeden Farbkanal einzeln)

- Wie setzt man diese Farbkanäle wieder zusammen? (Delphi-Referenz durchsuchenRGB)

- Wie findet man ähnliche Farbwerte? (Ähnlichkeitsvergleich ... da mußt du dir erstmal überlegen, WAS für dich "ähnlich" ist)

Jonas Shinaniganz 4. Okt 2012 21:59

AW: Farbmittelwert
 
Ich hätte mir folgendes gewünscht:

Zitat:

- Wie geht man alle Pixel in einem vorgegebenem Bereich (Rechteck) durch? (1-2 Schleifen)

Warum kein Wort über Scanline?

Zitat:

- Wie zerlegt man einen Farbwert? (RGB, Delphi-Referenz durchsuchenGetRValue usw.)

Die WinApi Funktionen kann Ich nicht benutzen (FM)

Zitat:

- Wie berechnet man einen Mittelwert aus mehreren Werten. (jeden Farbkanal einzeln)

Ich habe keine Farbkanäle da es sich um HSV/HSL Werte handelt

Zitat:

- Wie setzt man diese Farbkanäle wieder zusammen? (Delphi-Referenz durchsuchenRGB)
WinApi Funktion

Zitat:

- Wie findet man ähnliche Farbwerte? (Ähnlichkeitsvergleich ... da mußt du dir erstmal überlegen, WAS für dich "ähnlich" ist)
Ich finde $FFFFFFFF und $FFFFFFFE sind sich ähnlich der Farbe, welche Ich nach deinem Beitrag für unsere Beziehung sehe.
(Sorry der musste sein, Ich bin aber nicht Nachtragend)

Zitat:

Antwort: Fra mal deinen Mathelehrer, warum er es die nicht beigebracht hat oder schau bei Wiki.
Ich Fra deinen Mathelehrer ob du in der Schule auch so vorlaut warst.

Dankesehr.


Ich frage mich übrigens grade, wie ich einen RGB(Red,Green,Blue) Wert schlank in ein $FFFFFFFF 4Byte Hex Wert konvertiere...

Popov 4. Okt 2012 22:44

AW: Farbmittelwert
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1185800)
Zitat:

- Wie findet man ähnliche Farbwerte? (Ähnlichkeitsvergleich ... da mußt du dir erstmal überlegen, WAS für dich "ähnlich" ist)
Ich finde $FFFFFFFF und $FFFFFFFE sind sich ähnlich der Farbe, welche Ich nach deinem Beitrag für unsere Beziehung sehe.

Ich hab mal ein ähnliches Problem gehabt, d. h. Farben verglichen die ähnlich sind. Das ist an für sich ein kleines Problem, da RGB Farben nicht so ohne weiteres verglichen werden können. Letztendlich habe ich das mit einem kleinem Trick gelöst. Ich weiß aber, dass es direkt so nicht geht, denn der eine Wert besteht aus mehreren Werten. Ob es mit HSV/HSL einfacher geht weiß ich nicht.

Guck dir mal meine Frage an und da vor allem die Tipps von stahli.

Medium 5. Okt 2012 08:03

AW: Farbmittelwert
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1185800)
Ich frage mich übrigens grade, wie ich einen RGB(Red,Green,Blue) Wert schlank in ein $FFFFFFFF 4Byte Hex Wert konvertiere...

Delphi-Quellcode:
var
  r, g, b: Byte;
  myColor: TColor;
begin
  myColor := (b shl 16) or (g shl 8) or r;
end;
Zur Ähnlichkeit:
Wenn du schon im HSV/HSL Raum bist, ist's imho schon etwas einfacher Ähnlichkeit zu definieren. Da reicht es ja schon fast, Kanalweise mit etwas Toleranz heranzugehen. Beim H-Kanal würde diese dann recht klein ausfallen, bei S und V/L ggf. etwas größer. Was jetzt aber wirklich ähnlich ist, hängt einzig und allein von deiner persönlichen Einschätzung ab. Der Begriff ist nicht eindeutig definiert.

Für die Durchschnitte würde es sich hier lohnen, die HSV Werte als Koordinaten innerhalb der (Doppel-)Pyramide aufzufassen, die diese Räume aufspannen. Schau dir einfach mal den Wikipedia Artikel zu HSV an, dann wird schnell deutlich was ich meine. (Man kann theoretisch auch ganz naiv kanalweise mitteln wie bei RGB, hat aber bei H das Problem des Nulldruchgangs - es ist ja eigentlich ein Winkel.)

Caps 5. Okt 2012 08:34

AW: Farbmittelwert
 
Nur mal ganz kurz: man kann Farben auch zwischen den verschiedenen Farbmodellen umwandeln, ich kann Dir jetzt keine Quelle nennen (außer Google :wink:), aber vielleicht hilft das, wenn Du ein Modell nimmst, in dem Du leichter rechnen kannst.

Grüße

kamel08 5. Okt 2012 09:40

AW: Farbmittelwert
 
Für den Mittelwert kannst Du folgende Funktion nutzen;
(Hab' ich jetzt nicht getestet, kommt aber aus einem anderen Projekt und wurde nur für das Posting angepasst)
Das "Rechteck" ist in diesem Fall die gesamte an die Funktion übergebene Bitmap.

Delphi-Quellcode:
  Type
    TRGB = record
         r: byte;
         g: byte;
         b: byte;
    end;

Function TForm1.FarbWerte(Bitmap:TBitmap):TRGB;
type pixarray = Array[1..3] of Byte;
var y , x, zaehler, rot, gruen, blau : Integer;
    RGB:TRGB;
    P : ^pixarray;
begin
     bitmap.PixelFormat := pf24bit;
     rot:=0; gruen:=0; blau:=0; zaehler:=0;
     RGB.r := 0; RGB.g := 0; RGB.b := 0;
     for y := 0 to BitMap.Height - 1 do
     begin
          P := BitMap.ScanLine[y];
          for x := 0 to BitMap.Width - 1 do
          begin
               Inc(zaehler);
               rot := rot + P^[3];
               gruen := gruen + P^[2];
               blau := blau + P^[1];
               Inc(P);
          end;
     end;
     // Mittelwert berechnen
     if zaehler > 0 then
     begin
          RGB.r := rot div zaehler;
          RGB.g := gruen div zaehler;
          RGB.b := blau div zaehler;
     end;
     result := RGB;
end;
Die 'Binarisierung' (Pixel innerhalb der Toleranz schwarz zeichnen) findest Du sicherlich selbst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.

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