Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Bitmaps: Freistellungstool / Hintergrund markieren

  Alt 29. Okt 2006, 03:39
Zitat von alzaimar:
Erste Frage: Kennt Jemand die graphic32-Library und kann mir aus dem Stehgreif die Klasse nennen, die das kann?
Soweit ich die G32 kenne, kann sie das nicht von Hause aus so fix und fertig. Jedoch ist das ganze sehr simpel, solange du es wirklich ausschließlich und nur an einer Farbe (mit Toleranz) festmachen kannst, was Hintergrund ist und was nicht.

Eine Farbe besteht ja auf dem PC idR aus den drei (Licht-)Grundfarben Rot, Grün und Blau, die üblicherweise mit einem Wert von 0-255 für die Intensität der jeweiligen Farbkomponente angegeben wird. Nun kann man diese drei Werte auch als Vektor betrachten, und von einem Vektor kann ich die Länge berechnen! Die "Länge" des Farbvektors wäre demnach sqrt(r²+g²+b²). Diese rechnest du für deine Referenzfarbe R aus, und Pixelweise für jeden Bildpunkt des zu bearbeitenden Bildes (B). Wenn nun abs(|R|-|B|) <= Threshold, dann ist die Farbe des Bildpunktes nah genug an der Referenz, um als Hintergrund gelten zu können.

("|x|" ist die Kurzschreibweise für "Länge von x" bzw. "Betrag von x" (Der Betrag ist nämlich defakto nicht anderes als die Länge). Manche kennen auch eine leicht andere Schreibweise: "||x||")


\\Edith: Für den Schwellenwert wird es allerdings schwierig bis unmöglich eine Automatik zu bauen. Den sollte man daher vom User wählbar lassen. (O.g. dürfte in etwa auch das Vorgehen sein, welches diverse Bitmapprogramme für das Tool "Magic Wand" (Maskieren nach Farbähnlichkeit) zugrunde liegen haben. Nur dass sie noch drauf achten, dass die Maskierung im Rahmen der Toleranz vom Startpunkt aus zusammenhängend ist, was aber für diesen Fall hier eher ungeeignet wäre.)

Noch eine Idee: Du könntest ja sogar die Differenz der Fabrvektorlängen als Basis für die Berechnung eines Alphakanals her nehmen. Je nach dem wie das Bild dann aufgebaut ist (Schärfe z.B.) würde man damit einigermaßen "weich" freistellen können. Aber das nur so als Spielerei am Rande


Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat