2017-02-24 15 views
1

Wie man von dem Bild auf der linken Seite auf das Bild auf der rechten Seite programmgesteuert mit Python (und vielleicht einige Tools, wie OpenCV) gehen?Bild abschneiden/Hintergrund programmgesteuert entfernen in Python

original processed

machte ich auch dieses von Hand ein Online-Tool für Clipping verwenden. Ich bin absolut noob in der Bildverarbeitung (vor allem in der Praxis). Ich dachte daran, eine Kanten- oder Konturerkennung anzuwenden, um eine Maske zu erstellen, die ich später auf das Originalbild auftrage, um alles andere (außer der Region von Interesse) schwarz zu malen. Aber ich habe kläglich versagt.

Ziel ist die Vorverarbeitung eines Datensatzes mit sehr ähnlichen Bildern, um einen binären CNN-Klassifikator zu trainieren. Ich habe versucht, es zu trainieren, indem ich einfach das Bild in der Nähe der Region von Interesse beschneide, aber der Lärm ist so hoch, dass der CNN absolut nichts gelernt hat.

Kann mir jemand bei dieser Vorverarbeitung helfen?

Antwort

1

Ich verwendete OpenCV-Implementierung von watershed Algorithmus, um Ihr Problem zu lösen. Sie können herausfinden, wie man es benutzt, wenn Sie this great tutorial lesen, also werde ich das nicht in vielen Details erklären.

Ich wählte vier Punkte (Marker). Einer befindet sich in der Region, die Sie extrahieren möchten, einer ist draußen und die anderen beiden befinden sich im unteren/oberen Teil des Interieurs, der Sie nicht interessiert. Ich habe dann ein leeres Integer-Array (das sogenannte Marker-Image) erstellt und mit Nullen aufgefüllt. Dann habe ich Pixeln an Markerpositionen eindeutige Werte zugewiesen.

Das Bild unten zeigt die Markerpositionen und Markerwerte, auf dem Originalbild gezeichnet:

enter image description here

ich auch mehr Marker im gleichen Bereich wählen könnte (zum Beispiel mehrere Marker, die zu dem Bereich gehören Sie möchten extrahieren), aber in diesem Fall sollten alle dieselben Werte haben (in diesem Fall 255).

Dann habe ich Wasserscheide verwendet. Die erste Eingabe ist das Bild, das Sie angegeben haben, und die zweite Eingabe ist das Markerbild (überall Null außer an den Markerpositionen). Der Algorithmus speichert das Ergebnis im Markerbild; die Region, die Sie markiert mit dem Wert der Region Marker (in diesem Fall 255) interessiert:

enter image description here

Ich habe alle Pixel, die nicht die 255-Wert auf Null hatte. Ich erweiterte das erhaltene Bild dreimal mit 3x3 Kernel. Dann habe ich die dilatative Bild als Maske für das Originalbild (i gesetzt, alle Pixel außerhalb der Maske auf Null), und dies ist das Ergebnis bekam ich:

enter image description here

Sie werden wahrscheinlich eine Art von Verfahren müssen, dass findet Marker automatisch. Die Schwierigkeit dieser Aufgabe hängt stark von der Menge der Eingabebilder ab. In einigen Fällen kann die Methode sehr einfach und einfach sein (wie in dem oben verlinkten Tutorial), aber manchmal kann dies eine harte Nuss sein, die man knacken kann. Aber ich kann nichts empfehlen, weil ich nicht weiß, wie deine Bilder im Allgemeinen aussehen (du hast nur eine zur Verfügung gestellt). :)

+0

Scheint sehr vielversprechend. Alle Bilder sind sehr ähnlich, so dass ich eine Maske aus dem Mittelwert und/oder Standard-Entwicklung des gesamten Datensatzes machen konnte. Ich werde versuchen, es heute oder morgen zu machen, und ich werde dich wissen lassen, wie es gelaufen ist. Gute Arbeit, danke! – TasosGlrs

Verwandte Themen