Segmentierungsobjekte mit Ultralytics YOLO isolieren#
Instanzsegmentierung erstellt für jedes erkannte Objekt eine pixelgenaue Maske. Dadurch kannst du jedes Objekt einzeln aus einem Bild herauslösen. Dieser Leitfaden zeigt dir, wie du Segmentierungsergebnisse von Ultralytics YOLO mithilfe des Vorhersagemodus und OpenCV in isolierte Objekte umwandelst – entweder mit einem einfarbig schwarzen oder einem transparenten Hintergrund zum Speichern als PNG.
Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀
Warum Segmentierungsobjekte isolieren?#
Das Herauslösen einzelner Objekte aus einem Bild ermöglicht zahlreiche nachgelagerte Arbeitsabläufe:
- Hintergrundentfernung für Produktaufnahmen, Kataloge oder kreative Bearbeitung.
- Objektbezogene Ausschnitte, um aus deinen Erkennungen Klassifizierungsdatensätze zu erstellen.
- Fokussierte Verarbeitung, damit nachgelagerte Schritte wie OCR, Farbanalyse oder Vermessung nur das Objekt und nicht die umgebende Szene sehen.
- Export als transparentes PNG, um Objekte auf neue Hintergründe zu setzen.
Das Verfahren funktioniert mit jedem Ultralytics YOLO-Segmentierungsmodell und umfasst vier Schritte: Inferenz ausführen → jede Kontur extrahieren → das Objekt isolieren → das Ergebnis speichern.
Segmentierungsinferenz ausführen#
Installiere die erforderlichen Bibliotheken, lade anschließend ein Segmentierungsmodell (das Suffix -seg, das zum Erzeugen von Masken erforderlich ist) und führe die Vorhersage für dein Ausgangsbild 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 eine source aufrufst, verwendet Ultralytics ersatzweise die mit dem Paket ausgelieferten Beispielbilder (bus.jpg und zidane.jpg). Das ist praktisch, um den Arbeitsablauf schnell zu testen.
Objektkonturen extrahieren#
Jedes Element in results entspricht einem Bild, und beim Durchlaufen eines Ergebnisses erhältst du jeweils eine Erkennung. Kopiere für jede Erkennung das Originalbild, lies die Klassenbezeichnung aus und zeichne die Maskenkontur des Objekts auf eine leere Binärmaske. Der weiße Bereich dieser Maske kennzeichnet genau die Pixel, die zum Objekt gehören.
Die Codeausschnitte in diesem und im nächsten Abschnitt werden innerhalb der nachfolgenden Erkennungsschleife ausgeführt. Das vollständige, direkt kopierbare Skript findest du unter Vollständiges Beispiel.
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 die Masken-Kontur als Punktkoordinaten(x, y)für das Objekt in diesem Ergebnis mit einer einzelnen Erkennung zurück..astype(np.int32)konvertiert die Punkte ausfloat32, die OpenCVsdrawContours()nicht akzeptiert..reshape(-1, 1, 2)formt die Punkte in das Layout[N, 1, 2]um, dasdrawContours()erwartet, wobeiNdie Anzahl der Konturpunkte angibt.
Die Übergabe von [contour] mit dem Index -1 zeichnet alle Punkte der angegebenen Kontur, und cv2.FILLED füllt jedes eingeschlossene Pixel weiß aus.
Das Objekt isolieren#
Sobald die Binärmaske bereit ist, kombinierst du sie mit dem Originalbild. Je nachdem, wie der Hintergrund aussehen soll, gibt es zwei gängige Varianten:
Wandle die Maske in drei Kanäle um und behalte nur die Pixel, die sich mit dem Objekt überschneiden. Alles außerhalb der Kontur 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 Objektbereich statt des Bildes in voller Größe beizubehalten, 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 integriert. Übergib save_crop=True an predict(), und Ultralytics speichert automatisch Ausschnitte der Bounding Box – ganz ohne Maskierung.
Ergebnis speichern (optional)#
Was du mit jedem isolierten Objekt machst, bleibt dir überlassen. Ein üblicher nächster Schritt ist, es zur späteren Verwendung auf dem Datenträger zu speichern:
# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)Hier ist img_name der Stamm des Quelldateinamens, label der Klassenname und ci der Index der Erkennung. Dadurch erhalten mehrere Instanzen derselben Klasse eindeutige Dateinamen. Ersetze isolated durch iso_crop, wenn du den optionalen Zuschnitt oben angewendet hast.
Vollständiges Beispiel#
Das folgende Skript fasst alle Schritte in einem einzigen ausführbaren Block zusammen. Standardmäßig verwendet es einen schwarzen Hintergrund. Ersetze die markierte Zeile durch np.dstack([img, b_mask]), um stattdessen ein transparentes PNG zu erzeugen:
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 kannst du den Schleifenkörper in eine Funktion kapseln und sie für viele Bilder aufrufen.
Fazit#
Du verfügst jetzt über ein vollständiges Verfahren zum Isolieren segmentierter Objekte mit Ultralytics YOLO: Führe die Inferenz aus, erstelle aus jeder Kontur eine Binärmaske und extrahiere anschließend das Objekt vor einem schwarzen oder transparenten Hintergrund. Optional kannst du es auf seine Bounding Box zuschneiden. Sieh dir die vollständige Dokumentation zu Segmentierungsaufgaben und zum Vorhersagemodus an, um den Arbeitsablauf an deine eigenen Klassen anzupassen.
FAQ#
Lade ein Segmentierungsmodell, führe die Inferenz aus, erstelle aus der Kontur jeder Erkennung eine Binärmaske 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)Im vollständigen Beispiel findest du die vollständige Schleife für die Verarbeitung jeder Erkennung.
Es gibt zwei Hauptvarianten. Für einen schwarzen Hintergrund wandelst du die Maske in drei Kanäle um und verwendest
cv2.bitwise_and(). Für einen transparenten Hintergrund (beim Speichern als PNG) fügst du die Maske mitnp.dstack([img, b_mask])als vierten Alpha-Kanal hinzu. Beide Varianten werden unter Das Objekt isolieren gezeigt.Lies die Koordinaten der Bounding Box aus der Erkennung aus und schneide das isolierte Bild entsprechend zu:
x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32) iso_crop = isolated[y1:y2, x1:x2]Weitere Informationen zu Ergebnissen der Bounding Box findest du in der Dokumentation zum Vorhersagemodus.
Ultralytics YOLO bietet eine schnelle Echtzeit-Instanzsegmentierung mit präziser Erzeugung von Masken und Bounding Boxes sowie einer einfachen Python-API, die In###re-Sergebnisse mit wenigen Zeilen OpenCV-Code in isolierte Objekte umwandelt.
Ja. Verwende das Argument
save_cropinpredict(), um Ausschnitte der Bounding Box mit ihrem ursprünglichen Hintergrund zu speichern:results = model.predict(source="path/to/your/image.jpg", save_crop=True)Weitere Informationen findest du im Abschnitt Inferenzargumente des Vorhersagemodus.