Link to this sectionSo isolierst du Segmentierungsobjekte mit Ultralytics YOLO#
Instance Segmentation erzeugt eine pixelgenaue Maske für jedes erkannte Objekt, was bedeutet, dass du jedes Objekt einzeln aus einem Bild herauslösen kannst. Diese Anleitung zeigt dir, wie du Ultralytics YOLO Segmentierungsergebnisse mithilfe des Predict Mode und OpenCV in isolierte Objekte umwandelst – entweder mit einem soliden schwarzen Hintergrund oder transparent zum Speichern als PNG.
Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀
Link to this sectionWarum Segmentierungsobjekte isolieren?#
Das Herauslösen einzelner Objekte aus einem Bild eröffnet eine Reihe von nachgelagerten Workflows:
- Hintergrundentfernung für Produktfotos, Kataloge oder kreative Bearbeitung.
- Objektbezogene Zuschnitte, um Klassifizierungsdatensätze aus deinen Erkennungen zu erstellen.
- Fokussierte Verarbeitung, damit spätere Schritte wie OCR, Farbanalyse oder Messungen nur das Objekt sehen, nicht die Umgebung.
- Transparenter PNG-Export, um Objekte auf neue Hintergründe zu legen.
Das Rezept funktioniert mit jedem Ultralytics YOLO Segmentierungsmodell und umfasst vier Stufen: Inferenz ausführen → jeden Umriss extrahieren → das Objekt isolieren → das Ergebnis speichern.
Link to this sectionSegmentierungsinferenz ausführen#
Installiere die erforderlichen Bibliotheken, lade dann ein Segmentierungsmodell (das -seg Suffix, erforderlich für Masken) und führe die Vorhersage auf deinem Quellbild aus:
from ultralytics import YOLO
# Load a segmentation model
model = YOLO("yolo26n-seg.pt")
# Run inference on a source
results = model.predict(source="path/to/image.jpg")Wenn du model.predict() ohne source aufrufst, greift Ultralytics auf die mit dem Paket ausgelieferten Beispielbilder (bus.jpg und zidane.jpg) zurück, was praktisch ist, um den Workflow schnell zu testen.
Link to this sectionObjektumrisse extrahieren#
Jedes Element in results entspricht einem Bild, und das Iterieren über ein Ergebnis liefert eine Erkennung nach der anderen. Kopiere für jede Erkennung das Originalbild, lies das Klassenlabel und zeichne den Maskenumriss des Objekts auf eine leere binäre Maske. Der weiße Bereich dieser Maske markiert genau, welche Pixel zum Objekt gehören.
Die Code-Schnipsel in diesem und dem nächsten Abschnitt laufen innerhalb der Erkennungsschleife unten; das vollständige Skript zum Kopieren findest du unter Full Example.
{ width="240", align="right" }
from pathlib import Path
import cv2
import numpy as np
for r in results:
img = np.copy(r.orig_img)
img_name = Path(r.path).stem # source image base-name
# Iterate each detected object in the image
for ci, c in enumerate(r):
label = c.names[c.boxes.cls.tolist().pop()] # class name
# Build a binary mask and draw the object contour onto it
b_mask = np.zeros(img.shape[:2], np.uint8)
contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)c.masks.xy[0]gibt den Masken- Umriss als(x, y)Koordinatenpunkte für das Objekt in diesem einzelnen Erkennungsergebnis zurück..astype(np.int32)konvertiert die Punkte vonfloat32, was OpenCVsdrawContours()nicht akzeptiert..reshape(-1, 1, 2)reshapes the points into the[N, 1, 2]layoutdrawContours()expects, whereNis the number of contour points.
Die Übergabe von [contour] mit dem Index -1 zeichnet alle Punkte des angegebenen Umrisses, und cv2.FILLED füllt jeden umschlossenen Pixel weiß aus.
Link to this sectionIsoliere das Objekt#
Sobald die binäre Maske bereit ist, kombiniere sie mit dem Originalbild. Es gibt zwei gängige Arten, abhängig davon, wie der Hintergrund aussehen soll:
Konvertiere die Maske in drei Kanäle und behalte nur die Pixel, die das Objekt überlappen. Alles außerhalb des Umrisses wird schwarz:
# Isolate object with a black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)Um nur den Bereich des Objekts anstelle des Vollbilds zu behalten, schneide es auf die Bounding Box der Erkennung zu:
# Bounding box coordinates
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
# Crop the isolated image to the object region
iso_crop = isolated[y1:y2, x1:x2]Das ist bereits eingebaut. Übergib save_crop=True an predict() und Ultralytics speichert Bounding-Box-Zuschnitte automatisch, ohne dass eine Maskierung erforderlich ist.
Link to this sectionDas Ergebnis speichern (optional)#
Was du mit jedem isolierten Objekt machst, bleibt dir überlassen. Ein häufiger nächster Schritt ist das Speichern auf der Festplatte für die spätere Verwendung:
# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)Hier ist img_name der Name des Quellbildes, label der Klassenname und ci der Erkennungsindex, sodass mehrere Instanzen derselben Klasse eindeutige Dateinamen erhalten. Tausche isolated gegen iso_crop aus, falls du oben den optionalen Zuschnitt angewendet hast.
Link to this sectionVollständiges Beispiel#
Das folgende Skript kombiniert jeden Schritt in einem einzigen, ausführbaren Block. Es verwendet standardmäßig einen schwarzen Hintergrund; ändere die markierte Zeile in np.dstack([img, b_mask]), um stattdessen ein transparentes PNG zu erhalten:
from pathlib import Path
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/image.jpg")
for r in results:
img = np.copy(r.orig_img)
img_name = Path(r.path).stem
for ci, c in enumerate(r):
label = c.names[c.boxes.cls.tolist().pop()]
# Build a binary mask from the object contour
b_mask = np.zeros(img.shape[:2], np.uint8)
contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
# Isolate the object (black background)
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img) # transparent PNG: isolated = np.dstack([img, b_mask])
# Save or add your custom post-processing here
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)
# Optional: crop to the bounding box before saving
# x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
# cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated[y1:y2, x1:x2])Für die wiederholte Verwendung umschließe den Schleifenkörper mit einer Funktion, damit du sie für viele Bilder aufrufen kannst.
Link to this sectionFazit#
Du hast nun ein komplettes Rezept zum Isolieren von segmentierten Objekten mit Ultralytics YOLO: Inferenz ausführen, eine binäre Maske aus jedem Umriss erstellen, dann das Objekt auf einem schwarzen oder transparenten Hintergrund extrahieren und optional auf seine Bounding Box zuschneiden. Entdecke die vollständige Dokumentation zu Segment Task und Predict Mode, um den Workflow an deine eigenen Klassen anzupassen.
Link to this sectionFAQ#
Link to this sectionWie isoliere ich Objekte mit Ultralytics YOLO für Segmentierungsaufgaben?#
Lade ein Segmentierungsmodell, führe eine Inferenz aus, erstelle eine binäre Maske aus dem Umriss jeder Erkennung und kombiniere sie mit dem Originalbild:
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/your/image.jpg")
img = np.copy(results[0].orig_img)
b_mask = np.zeros(img.shape[:2], np.uint8)
contour = results[0].masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)Siehe das Full Example für die komplette Schleife pro Erkennung.
Link to this sectionWelche Optionen gibt es zum Speichern der isolierten Objekte nach der Segmentierung?#
Es gibt zwei Hauptstile. Konvertiere für einen schwarzen Hintergrund die Maske in drei Kanäle und verwende cv2.bitwise_and(). Staple für einen transparenten Hintergrund (beim Speichern als PNG) die Maske als vierten Alpha-Kanal mit np.dstack([img, b_mask]). Beides wird unter Isolate the Object gezeigt.
Link to this sectionWie kann ich isolierte Objekte auf ihre Bounding Box zuschneiden?#
Lies die Koordinaten der Bounding Box aus der Erkennung und schneide das isolierte Bild zu:
x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]Erfahre mehr über Bounding-Box-Ergebnisse in der Dokumentation zum Predict Mode.
Link to this sectionWarum sollte ich Ultralytics YOLO für die Objektisolierung bei Segmentierungsaufgaben verwenden?#
Ultralytics YOLO bietet schnelle Echtzeit-Instanzsegmentierung mit präziser Masken- und Bounding-Box-Generierung sowie eine einfache Python API, die Inferenz-Ergebnisse in wenigen Zeilen OpenCV-Code in isolierte Objekte verwandelt.
Link to this sectionKann ich isolierte Objekte inklusive Hintergrund mit Ultralytics YOLO speichern?#
Ja. Verwende das Argument save_crop in predict(), um Bounding-Box-Zuschnitte mit ihrem ursprünglichen Hintergrund zu speichern:
results = model.predict(source="path/to/your/image.jpg", save_crop=True)Lies mehr im Abschnitt Predict Mode Inference Arguments.