AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmaps: Freistellungstool / Hintergrund markieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmaps: Freistellungstool / Hintergrund markieren

Ein Thema von alzaimar · begonnen am 26. Okt 2006 · letzter Beitrag vom 31. Okt 2006
Antwort Antwort
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Bitmaps: Freistellungstool / Hintergrund markieren

  Alt 26. Okt 2006, 21:46
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!
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Bitmaps: Freistellungstool / Hintergrund markieren

  Alt 28. Okt 2006, 22:26
*push*
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
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
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Bitmaps: Freistellungstool / Hintergrund markieren

  Alt 29. Okt 2006, 18:37
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

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

Re: Bitmaps: Freistellungstool / Hintergrund markieren

  Alt 31. Okt 2006, 14:25
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 )
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Bitmaps: Freistellungstool / Hintergrund markieren

  Alt 31. Okt 2006, 15:09
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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 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