Pattern in Bild finden

DarkHell

Neu angemeldet
Registriert
22 Aug. 2013
Beiträge
25
Hi ich hab ein kleines Problem,

ich suche einen Ansatz wie ich am schnellsten in einem Bild (RGB) ein spezielles Muster/Pattern finden kann.
Irgendwie ist das blöd zu beschreiben, daher hab ich schnell ein Beispiel Bild gemacht von dem Pattern und eben zwei Positionen wo das sein kann...
Hintergrund ist, dass ich Hunderte Bilder habe und ein Symbol zwar sicher auf dem Bild ist, jedoch immer an anderer stelle sein kann. Ich brauche was daneben steht. (Deshalb muss ich die Position finden).
suche.png

Ich habe nun drei ansätze versucht.

1. mit getpixel -> sehr sehr langsam und eigentlich einfach unpraktikabel
2. mit AForge.NET Framework-2.2.5, dort kann ich zwar ein Kreis in einem Bild ohne probleme finden, jedoch ist mein Symbol kein kreis.
3. das Bild raw vergleichen, jedoch ist es sehr sehr verwirrend mir dann wieder auf meine Pixelposition in dem Bild zu gelangen. (weil die muss ich mir merken).

Leider komme ich mit keinem der ansätze klar, hat mir eventuell irgendeiner einen Lösungsansatz, mir fällt seit Tagen nichts ein und ich finde im Internet auch nichts vernünftiges...
Sprache mit der ich es Umsetzen möchte (da das restliche Programm in MS Visual Studio geschrieben ist) wäre C#.

Falls aber jemand in einer anderen Sprache eine Idee hätte, wäre ich natürlich auch happy =).

Danke schon mal,

€dit: Scheint als ob das Bild nicht angezeigt wurde?!

Gruß,
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #3
sieht man es nicht ? ich habs mal anderst hinzugefügt zwischen (Deshalb muss ich die Position finden). & Ich habe nun drei ansätze versucht. sollte es sein
 
@DarkHell:

ist der Rest des Bildes leer, so wie in deinem Beiispiel?

wäre gut wenn du Original Beispiele zeigen könntest...
 
Immer etwas verdächtig
"Ich habe hier bilder und will die Wasserzeichen entfernen ein nicht näher beschriebenes Muster auf dem Bild finden. Konkretes Beispiel kann ich leider nicht angeben weil ihr mir dann vermutlich nicht mehr helfen wollt.
:D
 
Mein Ansatz wäre jetzt alle Möglichen Positionen Pixelweise zu vergleichen, das meinstest du wahrscheinlich mit "getPixel"? Klar dauert das ein Wenig, sollte aber je nach Auflösung der Bilder im Rahmen bleiben. Probleme bekommst du aber, wenn das Logo/Suchmuster nicht immer exakt gleich ist, z.B. wegen Transparenz oder sogar schon von JPEG Komprimierung. Dann müsste man wahrscheinlich die Ähnlichkeit der Pixel bewerten, was wahrscheinlich noch mal Rechenaufwändiger wird.

@BurnerR: Ich denke nicht dass sich durch diese Technik Wasserzeichen gut entfernen lassen, das Problem ist ja nicht das finden des Symbols sondern das Füllen des verdeckten Bereichs. Des weiteren denke ich dafür gibt es schon genügend Tools :D
 
das Problem ist ja nicht das finden des Symbols sondern das Füllen des verdeckten Bereichs.
Ist das so? Meinem empfinden nach wäre die Identifizierung ein zwangsläufiger Schritt.

Aber gut. Offenbar gibt es ein Programm drumherum und die Frage ist an sich schon interessant genug das man darüber sprechen kann.
Dann müsste man wahrscheinlich die Ähnlichkeit der Pixel bewerten, was wahrscheinlich noch mal Rechenaufwändiger wird.
Das ist potenziell nicht nur aufwändiger, sondern ein eigenes Teilproblem. Das erste was einem da einfällt ist die Wahl eines geeigneten Farbraumes wie z.B. HSV.


Das Problem fällt in den Bereich Maschinelles Sehen / Computer Vision, Objekterkennung.
Diverse Algorithmen wurden und werden in dem Bereich entwickelt. Eine größere C/C++ Bibliothek ist opencv.
 
  • Thread Starter Thread Starter
  • #8
Hey,

ne es ist nichts illegales oder der gleichen, das sind in der Firma Prüfbilder von einem AOI, dort werden leiterplatten Nutzen eingelesen und überprüft, wenn etwas Falsch ist wird an die Stelle ein Pfeil gesetzt mit dem StationsLogo. Ich möchte nun die ganzen Bilder mal Auswerten lassen und mir eine Statistik darüber machen was für Bauteile / Stellen hauptsächlich Fehler verursachen um da dagegen etwas zu unternehmen (das kann das AOI Leider nicht von haus aus ..). Das Logo dass ich finden möchte ist auch nicht Transparent oder irgendwas sondern ist 3 Farbig immer gleich und on Top. Wie gesagt wenn ich mir das Bild in ein BMP Wandle, und dann das Logo Raw suchen lasse Funktioniert das schon, nur komm ich dann nicht auf die Pixelposition und auch nicht an die Daten neben dran.

Wir haben das schon über Ferienjobber Auswerten lassen, aber erstens sind das massen an Bildern, dann das die das dann in eine Datenbank eintragen ist einfach sehr Fehlerträchtig.

@Kampfmelone, das Problem ist es kann an jeder Position von dem Bild sein, daher ist es untragbar langsam und dauert pro Bild ca 30 Sekunden und ist auch noch anfällig.
@evillive leider kann ich die nicht Hochladen, da sie aus der Firma sind und ich von dort keine Daten rausnehmen darf (hat nichts mit nicht wollen zu tun sondern mit dem Arbeitsvertrag :)).
@BurnerR ich hab bislang eben AForge.NET probiert (damit krieg ich die Erkennung von Kreisen ohne Probleme hin aber eben nicht von sonderformen), aber scahu mir mal das opencv an danke :)

Man kann sich das ganze vorstellen wie ein Foto von einer "Landschaft" und irgendwo ist ein Stempeldrauf (der ist Scharf und nicht verpixelt). Also es sind unten immer unterschiedliche Bildinhalte (unterschiedliche Produkte).

Gruß,
 
Mein Ansatz wäre jetzt alle Möglichen Positionen Pixelweise zu vergleichen, das meinstest du wahrscheinlich mit "getPixel"? Klar dauert das ein Wenig, sollte aber je nach Auflösung der Bilder im Rahmen bleiben.



ein Möglichkeit wäre ja alle Bilder zu verkleinern. Da müsste man halt eine optimale Größe finden..

@DarkHell

kannst du nicht ein ordentliches Beispiel zeigen? Es wird doch nicht so einfach sein, wie in deiner Skizze oder? Also schwarz weiß wird es wohl nicht sein. Und es wird wohl auch nicht nur dein Pattern zu sehen sein. Man muss eigentlich schon wissen welche Objekte sich im Hintergrund befinden, welche Objekte im Vordergrund sind...
 
Wie gesagt, für solche Aufgaben denkt man sich nicht selber "mal eben" einen Algorithmus aus, sondern greift auf bestehende zurück.

ich hab bislang eben AForge.NET probiert (damit krieg ich die Erkennung von Kreisen ohne Probleme hin aber eben nicht von sonderformen
Dann hast du höchstwahrscheinlich die Dokumentation bestenfalls überflogen. AForge bietet soweit ich das sehe diverse Algorithmen dafür an. Meines erachtens nach wird jede CV Bibliothek entsprechende Algos anbieten. Wenn ich dich recht verstehe ist das gesuchte Muster nicht transformiert auf den Bildern, sondern 1:1.
 
Es gibt einige Ansätze Shortespath's durch Bilder zu berechnen, die du eventuell verwenden könntest. Eine andere Idee wäre dich auf Kantenerkennung zu beschränken.
 
Sowas macht man eigentlich im Frequenzbereich (Stichwort 2D-FFT). Direkt die Pixel angucken geht natürlich auch, ist aber eher langsam und wenig robust.
Mein persönlicher Ansatz wäre, den Algorithmus in Matlab zu entwickeln (Image Processing Toolbox) und daraus Code zu generieren. Ich vermute allerdings, dass das genannte Framework (AForge) diese Funktionalität auch bietet, habe damit aber keine Erfahrung.
 
  • Thread Starter Thread Starter
  • #13
Hey @ll,

danke für die vielen Posts. Ihr bestätigt mir wenigstens, dass ich nicht zu doof war was total Simples einfach nicht zu finden *ggg*.

Ich werde mich mal weiter mit AForge beschäftigen, ist ja schon ein mächtiges Tool :)

Sowas macht man eigentlich im Frequenzbereich (Stichwort 2D-FFT). Direkt die Pixel angucken geht natürlich auch, ist aber eher langsam und wenig robust.
Mein persönlicher Ansatz wäre, den Algorithmus in Matlab zu entwickeln (Image Processing Toolbox) und daraus Code zu generieren. Ich vermute allerdings, dass das genannte Framework (AForge) diese Funktionalität auch bietet, habe damit aber keine Erfahrung.

@Maxwell, die FFT kenn ich nur um zu Überprüfen OB es überhaupt vorhanden ist und nicht wo. Wie kann ich darüber die Pixelposition ermitteln?!? Gut ich könnte bereiche durchfahren wo ich sag es muss dann in dem Bereich liegen aber hmm . Oder steh ich da noch auf dem Schlauch? Werd mich auch da mal weiter einlesen. Danke für die Anregungen :)
 
Du kannst die von deinem Bild und dem gesuchten Muster berechnen. An der Position des Musters wird es einen hellen Peak geben. Dieses Maximum kannst du dann einfach suchen.
 
Zurück
Oben