bestimmten Farbraum aus Bild heraussuchen
-
Hallo
ich habe ein Bild im RGB Format , 24bit Farbtiefe.
Ich suche nach einer Möglichkeit dort Pixel herauszusuchen, welche z.b rot sehr nahe kommen.
Hier mal ein Beispiel:
http://www.kirmes-gruempen.de/bild.jpg
Auf diesem Bild z.b würde ich gerne das nur der Stift , also das rosa-teil erkannt wird. die Grenzen müssen net genau passen, auch net der ganze Stift, aber wenigstens keine Pixel außenrum.
Habs jetzt über Umrechnung von RGB->HSV und dann eine einfache if-Abfrage probiert, der großteil des Stifetes war auch selektiert, aber eben auch sehr viel außenrum.
Bsp:
(m_Bitmap->GetPixel(x,y).GetHue()>0 && m_Bitmap->GetPixel(x,y).GetHue()<10) || (m_Bitmap->GetPixel(x,y).GetHue()>350 && m_Bitmap->GetPixel(x,y).GetHue()<360) && m_Bitmap->GetPixel(x,y).GetSaturation()>0.5 && m_Bitmap->GetPixel(x,y).GetBrightness()>0.7)
Hoffe ich bin hier richtig, geht ja mehr um eine Algorithmus findung.
Mfg
Reinhold Fischer
-
Du könntest noch abfragen, ob in einer bestimmten Nähe auch rote Pixel sind. Also z.B. erst eine Karte erstellen, wo alle mehr oder weniger roten Pixel eingetragen sind und dann die Pixel, die ganz alleine irgendwo in der Gegend sind, rauslöschen. So solltest du schonmal keine einzelnen Pixel irgendwo in der Landschaft bekommen.
-
So gehts...
Nimm das Bild...
Mach nen RGB Split...
Dann hast du für jeden Farbkanal ein Grauwertbild (8-bit)
Dann erzeuge das Differenzbild von Rot-Kanal und Grün-Kanal
Dann erzeuge ein Binärbild mit Threshold so um die 40Fertig.
-
PixelMaster schrieb:
So gehts...
Nimm das Bild...
Mach nen RGB Split...
Dann hast du für jeden Farbkanal ein Grauwertbild (8-bit)
Dann erzeuge das Differenzbild von Rot-Kanal und Grün-Kanal
Dann erzeuge ein Binärbild mit Threshold so um die 40Fertig.
... und lass dann nen rauschfilter drüber laufen um so kleine ausreißer zu eleminieren.
-
PixelMaster schrieb:
So gehts...
Nimm das Bild...
Mach nen RGB Split...
Dann hast du für jeden Farbkanal ein Grauwertbild (8-bit)
Dann erzeuge das Differenzbild von Rot-Kanal und Grün-Kanal
Dann erzeuge ein Binärbild mit Threshold so um die 40Fertig.
Warum gerade die Differenz zwischen Rot und Gruen?
-
Weil der Vorhang im Hintergrund weiß ist. Ein reines Weiß hat genausoviele Rotanteile wie ein reines Rot. Ein reines Weiß hat auch maximal viele Grünanteile. Der Stift hat viele Rotanteile, aber kaum Grünanteile. Durch das Differenzbild kann man den Stift vom weißen Hintergrund trennen.
-
ReinholdFischer schrieb:
(m_Bitmap->GetPixel(x,y).GetHue()>0 && m_Bitmap->GetPixel(x,y).GetHue()<10) || (m_Bitmap->GetPixel(x,y).GetHue()>350 && m_Bitmap->GetPixel(x,y).GetHue()<360) && m_Bitmap->GetPixel(x,y).GetSaturation()>0.5 && m_Bitmap->GetPixel(x,y).GetBrightness()>0.7)
Nur so nebenbei: Wie bist du auf die Bereiche 350-10°, >0.5, >0.7 gekommen? Hast du dir die Werte aus dem Bild angeguckt oder einfach geraten?
-
Wie unterscheidest du dann reines Rot von z.b. lila (wo du nur blaue und rote, aber keinen gruenen Anteile hast)?
-
Wäre durch Fallunterscheidung schon möglich. Der Algo mit dem Differenzbild funzt allerdings so nur in dieser Konstellation(roter Stift, weißer Hintergrund).
Grundsätzlich ist der bessere Weg Farbdistanzen zu messen. Da gibt es ein bzw. mehrere Maße für : DeltaE, DeltaE2000 etc.
Der generischste Weg ist wohl eine Suchfarbe zu definieren und dann alle Pixel im Bild nach ihrer Farbdistanz zum Suchfarbton zu fragen. Wenn die Farbdistanz über einem Schwellwert liegt, dann gehört der Bildpunkt nicht zum Suchfarbton. Es wird also erst mal ein Binärbild erstellt.
Danach kann man mit einem Connected Components Algorithmus im Binärbild nach zusammenhängenden Regionen suchen. Die größte zusammenhängende Region ist dann der Top-Kandidat für das Suchmuster. Evtl. muss man aber auch alle Kandidaten-Regionen im Biärbild auf bestimmte Eigenschaften untersuchen, um sicher das Suchobjekt zu lokalisieren.Probleme wird man aber haben, wenn der Hintergrund eine ähnliche Farbe wie der Stift hat. Dann haben aber auch andere Algorithmen Probleme das Objekt vom Hintergrund zu trennen.
-
Dankeschön für die vielen Anregungen, ich werde die Tage ( wenn ich mal wieder ein bißchen Zeit habe) den Ansatz von _PixelMaster_ ausprobieren,
und die Ergebnisse hier posten.Mfg
Reinhold Fischer