Get-Bereich innerhalb der Konturen Python-Opencv?
Benutzt habe ich eine adaptive schwellenwertbestimmung Technik zu erstellen, ein Bild wie unten:
Den code, den ich verwendet wurde, war:
image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 45, 0)
Habe ich dann diesen code verwenden, um Konturen:
cnt = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[0]
Mein Ziel ist das generieren einer Maske, mit der alle Pixel innerhalb der äußeren Kontur, so will ich füllen Sie alle Pixel innerhalb des Objekts, weiß zu sein. Wie kann ich dies tun?
Habe ich versucht den code unten, um eine Maske zu erstellen, aber die resultierende Maske scheint nicht anders dann das Bild nach der Anwendung adaptive threshold
mask = np.zeros(image.shape[:2], np.uint8)
cv2.drawContours(mask, cnt, -1, 255, -1)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie haben, ist fast richtig. Wenn Sie einen Blick auf Ihre thresholded Bild, der Grund, warum es nicht funktioniert ist, weil Sie Ihren Schuh-Objekt hat Lücken in das Bild. Speziell, was Sie wollen, ist, dass Sie erwarten, dass der Schuh hat seinen Umfang zu alle verbunden. Wäre dies geschehen, dann, wenn Sie extrahieren die äußere Kontur (das ist, was Ihr code tut), sollten Sie nur eine Kontur repräsentiert den äußeren Umfang des Objekts. Sobald Sie füllen Sie die Kontur, dann wird Ihr Schuh sollte vollständig fest.
Weil der Umfang des Schuhs nicht abgeschlossen und gebrochen, führt dies zu getrennten weißen Regionen. Sollten Sie
findContours
finden Sie alle Konturen, es werden nur die Konturen der einzelnen weißen Formen und nicht die Außenhaut. Als solche, wenn Sie versuchen, und verwenden SiefindContours
, erhalten Sie das gleiche Ergebnis wie das original Bild, weil du bist einfach das finden der Umfang jedes weiße Bereich innerhalb des Bildes, dann die Füllung in diesen Regionen mitfindContours
.Was Sie tun müssen, ist sicherzustellen, dass das Bild komplett geschlossen. Was würde ich empfehlen Sie tun, ist mit Morphologie zu schließen, alle getrennten Regionen zusammen, dann führen Sie eine
findContours
nennen, die auf diesem neuen Bild. Insbesondere führen Sie eine binäre morphologische schließen. Was dies bedeutet ist, dass es dauert, getrennt white Regionen zusammen zu schließen und sorgt dafür, dass Sie verbunden sind. Verwenden Sie einen morphologischen closing, und vielleicht so etwas wie ein 7 x 7-Quadrat Strukturelement zum schließen des Schuhs. Diese strukturierende element, das Sie können denken, als die minimale Trennung zwischen den weißen Regionen zu halten Sie angeschlossen sind.Als solche, etwas wie das hier tun:
Dieser code im wesentlichen nimmt Ihre thresholded Bild, und gilt morphologischen closing zu diesem Bild. Nach, finden wir die äußeren Konturen dieses Bildes, und füllen Sie Sie mit weiß. FWIW, ich habe Ihre thresholded Bild, und versucht, diese auf meinem eigenen. Dies ist es, was ich mit deinem Bild:
drawing.cpp:2380: error: (-215) npoints > 0 in function cv::drawContours
- ich bin mit OpenCV 3.1 und Python 2.7. Irgendwelche Ideen?Ein einfacher Ansatz wäre zum schließen der Löcher im Vordergrund, um eine einzelne Kontur mit
cv2.morphologyEx()
undcv2.MORPH_CLOSE
Nun, dass die äußere Kontur gefüllt ist, finden wir die äußere Kontur mit
cv2.findContours()
und verwendencv2.fillPoly()
füllen Sie alle Pixel mit weiß