![]() |
Bitmaps: Freistellungstool / Hintergrund markieren
Hi,
Ich möchte mit der graphic32-Library (oder irgend einer anderen Bibliothek) den Hintergrund eines Bildes wegrechnen. Na ja, um die Sache etwas zu vereinfachen: Der Hintergrund ist einigermaßen einfarbig (also keine Bäume oder so). Nun gibt es ein nettes Verfahren, was über HSL geht: RGB in HSL umrechnen, und wenn der Abstand zur Hintergrundfarbe klein genug ist, dann ist es ein Hintergrundpixel. Es gibt auch einige Arbeiten darüber usw. Erste Frage: Kennt Jemand die graphic32-Library und kann mir aus dem Stehgreif die Klasse nennen, die das kann? Zweite Frage: Kennt Jemand überhaupt irgend eine Library (kostenlos), die soetwas kann? Dritte Frage: Kennt Jemand irgend eine kommerzielle Libray, die das kann? Ich setz mich natürlich auch gerne selbst hin, und programmier das, aber wozu das Rad 2x erfinden? Außerdem (und das ist der Hauptgrund) ist das Finetuning, also z.B. die Schwelle (threshold), wie groß der 'Abstand' sein darf, etwas kniffelig. Meine Erfahrungen auf dem Gebiet sind eher bescheiden. Ich hab auch noch eine eigene Methode im Hinterkopf, aber ich wollte erst mal sehen, wie das Andere hinbekommen. Danke im Voraus für Eure Mühe! |
Re: Bitmaps: Freistellungstool / Hintergrund markieren
*push* :oops:
|
Re: Bitmaps: Freistellungstool / Hintergrund markieren
Zitat:
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 |
Re: Bitmaps: Freistellungstool / Hintergrund markieren
Hi Fabian,
Während der Lektüre einiger Artikel bin ich auch immer wieder auf diesen Abstand gestoßen, allerdings im HSL-Farbraum. Soo simpel wie Du wurde das aber nicht erklärt. Ich werde mal damit experimentieren. Das Tool muss sowohl die Hintergrundfarbe ermitteln, als auch den Hintergrund vollständig automatisch wegrechnen können. Danke für die Info. |
Re: Bitmaps: Freistellungstool / Hintergrund markieren
Die Idee dass erst nach HSL umzurechnen ist garnicht dumm. Mir fällt nämlich gerade auf, dass bei meiner Idee oben ein reines Blau die selbe Länge wie ein reines Rot ergeben würde, womit sie als gleiche Farben angesehen würden. Das ist grob falsch :?.
Im HSL Raum hat man dagegen echt schöne Möglichkeiten, sehr differenziert vorzugehen. Weil du kannst dann eine Toleranz für den Farbwert (Hue), seine Sättigung (Saturation) und Helligkeit (Lightness) angeben, was insgesamt deutlich mehr Varianten ergibt gute Einstellungen für jedes Bild zu ermitteln. Also: Auf den zweiten Blick würde ich tatsächlich auch sehr zur Bearbeitung im HSL Raum tendieren, dort aber mit getrennter Betrachtung der einzelnen Komponenten, und nicht als ein Vektor. (Was natürlich auch eine gute Variante darstellen könnte, da man damit eine Gesamttoleranz angebenwürde, die sich beliebig auf die 3 Komponenten aufteilen kann, so dass bei exakt selbem Farbton damit größere Varianz in Helligkeit und Sättigung gewährt würden, usw. Doch, das ist ein schönes Verfahren :)) |
Re: Bitmaps: Freistellungstool / Hintergrund markieren
Ich plane, die H,S und L-Anteile verschieden zu gewichten und dann wieder mit Abständen zu arbeiten. Im Internet habe ich eine sehr kompakte C-Implementation gefunden, die ich demnächst mal antesten will.
Das Grab-Cut-Verfahren von Microsoft ist wohl ziemlich gut dokumentiert und das derzeit Beste, was es gibt. Allerdings dürfte das nicht trivial sein (jedenfalls nicht so trivial wie HSL)... Ich halte Dich auf dem Laufenden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 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