Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmaps: Freistellungstool / Hintergrund markieren (https://www.delphipraxis.net/79714-bitmaps-freistellungstool-hintergrund-markieren.html)

alzaimar 26. Okt 2006 21:46


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!

alzaimar 28. Okt 2006 22:26

Re: Bitmaps: Freistellungstool / Hintergrund markieren
 
*push* :oops:

dizzy 29. Okt 2006 03:39

Re: Bitmaps: Freistellungstool / Hintergrund markieren
 
Zitat:

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

alzaimar 29. Okt 2006 18:37

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.

dizzy 31. Okt 2006 14:25

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 :))

alzaimar 31. Okt 2006 15:09

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