Ich konnte keine detaillierte Erklärung der Python-Version von OpenCV findcontours im Internet finden, daher möchte ich notieren, was ich versucht habe. Wenn Sie einen Fehler machen, weisen Sie bitte darauf hin.
Wenn Sie den Umriss eines Bildes mit OpenCV extrahieren möchten, verwenden Sie eine Funktion namens findContours. Das Eingabebild wird als erstes Argument verwendet, der Extraktionsmodus wird als zweites Argument verwendet und die Approximationsmethode wird als drittes Argument verwendet.
findcontours Funktion
image, contours, hierarchy = cv2.findContours(Bild eingeben,Extraktionsmodus,Ungefähre Methode)
Dieser Artikel erklärt nicht die Approximationsmethode. Wir verwenden eine einheitliche Approximationsmethode namens "cv2.CHAIN_APPROX_SIMPLE".
Ein Blob bedeutet "Klumpen" und bezieht sich auf eine Masse schwarzer oder weißer Pixel. Bei der Konturextraktion scheint sich die Methode zum Extrahieren der Kontur zwischen der Kontur des weißen Blobs und der Kontur des schwarzen Blobs zu unterscheiden, daher werde ich sie weiter unten erläutern.
Der Umriss des schwarzen Blobs scheint die Eckpunkte der äußersten Matrix des Blobs gegen den Uhrzeigersinn zu extrahieren.
Der Umriss des weißen Blobs scheint die Außenseite der äußersten Matrix des Blobs im Uhrzeigersinn zu extrahieren, wie in der folgenden Abbildung gezeigt.
Bei der Erkennung der Kontur von außen wird zuerst Schwarz erkannt. Wenn Sie also einen schwarzen Fleck auf weißem Hintergrund haben, wird der schwarze Fleck zuerst erkannt. Wenn Sie jedoch einen schwarzen Hintergrund haben, wird der schwarze Hintergrund zuerst erkannt. Vorsicht ist geboten.
Ausgabe
[array([[[1, 1]],
[[1, 8]],
[[8, 8]],
[[8, 1]]])]
Die Reihenfolge, in der die Konturen der Blobs erfasst werden, scheint in absteigender Reihenfolge des y-Werts der Koordinaten des Startpunkts der Konturextraktion zu liegen. Wenn die y-Werte gleich sind, ist die Reihenfolge der größeren x-Werte früher.
Es gibt mindestens vier Extraktionsmodi: `` RETR_EXTERNAL```,
RETR_LIST```,
RETR_CCOMP``` und
`RETR_TREE```.
RETR_EXTERNAL RETR_EXTERNAL ist ein Modus, der nur die äußerste Kontur der Kontur extrahiert. Selbst wenn sich innerhalb der Kontur eine Kontur befindet, wird diese nicht extrahiert. Daher wird der Umriss des weißen Blobs nicht erkannt.
Ausgabe
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]])]
RETR_TREE RETR_TREE ist eine perfekte Darstellung verschachtelter Konturen. Mit anderen Worten, zuerst werden die schwarzen Blobs in der unter "Was ich bemerkt habe" erläuterten Reihenfolge erkannt, und wenn ein Blob mit einer verschachtelten Struktur gefunden wird, wird der Umriss des Blobs in diesem Blob extrahiert.
Ausgabe
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]]), array([[[1, 2]],
[[2, 1]],
[[4, 1]],
[[5, 2]],
[[5, 4]],
[[4, 5]],
[[2, 5]],
[[1, 4]]]), array([[[3, 3]]])]
RETR_LIST RETR_LIST erhält Konturen in derselben Hierarchie, unabhängig von der weißen Kontur, der schwarzen Kontur, innen oder außen. Daher ist die Reihenfolge des Erfassens von Konturen die in "in Was mir aufgefallen ist" erläuterte Reihenfolge.
Ausgabe
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[3, 3]]]), array([[[1, 2]],
[[2, 1]],
[[4, 1]],
[[5, 2]],
[[5, 4]],
[[4, 5]],
[[2, 5]],
[[1, 4]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]])]
RETR_CCOMP RETR_CCOMP extrahiert zuerst alle Konturen der schwarzen Blobs und dann die Konturen der weißen Blobs. Die Bestellung entspricht der in "・ Was mir aufgefallen ist" erläuterten Reihenfolge.
Ausgabe
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[3, 3]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]]), array([[[1, 2]],
[[2, 1]],
[[4, 1]],
[[5, 2]],
[[5, 4]],
[[4, 5]],
[[2, 5]],
[[1, 4]]])]
Recommended Posts