So isolierst du Segmentierungsobjekte mit Ultralytics YOLO#
Instance segmentation liefert für jedes erkannte Objekt eine pixelgenaue Maske, sodass du jedes Objekt einzeln aus einem Bild herausschneiden kannst. Dieser Leitfaden zeigt dir, wie du mit Predict Mode und OpenCV Ultralytics YOLO-Segmentierungsergebnisse in isolierte Objekte verwandelst – entweder mit einem einfarbig schwarzen Hintergrund 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 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 gliedert sich in vier Phasen: Inferenz ausführen → jede Kontur extrahieren → das Objekt isolieren → das Ergebnis speichern.
Segmentierungsinferenz ausführen#
Installiere die erforderlichen Bibliotheken, lade dann ein Segmentierungsmodell (das Suffix -seg, das für die Erstellung von Masken erforderlich ist) und führe die Vorhersage für dein 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.
Objektumrisse extrahieren#
Jedes Element in results entspricht einem Bild, und das Iterieren über ein Ergebnis liefert jeweils eine Erkennung. Kopiere für jede Erkennung das Originalbild, lies das Klassenlabel aus und zeichne die Maskenkontur des Objekts auf eine leere binäre Maske. Der weiße Bereich dieser Maske markiert genau, welche Pixel zum Objekt gehören.
Die Ausschnitte in diesem und dem nächsten Abschnitt laufen innerhalb der untenstehenden Erkennungsschleife; das vollständige, kopierbare Skript befindet sich 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 die Masken- Kontur als(x, y)-Punktkoordinaten für das Objekt in diesem Einzelerkennungsergebnis zurück..astype(np.int32)konvertiert die Punkte vonfloat32, was OpenCVsdrawContours()nicht akzeptiert..reshape(-1, 1, 2)formt die Punkte in das vondrawContours()erwartete Layout[N, 1, 2]um, wobeiNdie Anzahl der Konturpunkte ist.
Durch die Übergabe von [contour] mit dem Index -1 werden alle Punkte der mitgelieferten Kontur gezeichnet, und cv2.FILLED füllt jedes eingeschlossene Pixel weiß aus.
Isoliere 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 integriert. Übergib save_crop=True an predict(), und Ultralytics speichert Begrenzungsrahmen-Ausschnitte automatisch, ohne dass eine Maskierung erforderlich ist.
Das 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, wenn du den obigen optionalen Zuschnitt angewendet hast.
Vollständiges Beispiel#
Das folgende Skript kombiniert jeden Schritt zu einem einzigen, ausführbaren Block. Standardmäßig wird ein schwarzer Hintergrund verwendet; ändere die einzelne 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.
Fazit#
Du hast nun ein vollständiges Rezept zur Isolierung von segmentierten Objekten mit Ultralytics YOLO: Inferenz ausführen, eine binäre Maske aus jeder Kontur erstellen, dann das Objekt auf einem schwarzen oder transparenten Hintergrund extrahieren und optional auf seinen Begrenzungsrahmen zuschneiden. Erkunde die vollständige Dokumentation zu Segment Task und Predict Mode, um den Workflow an deine eigenen Klassen anzupassen.
FAQ#
Wie 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 Full Example für die vollständige Schleife pro Erkennung.
Welche Optionen gibt es zum Speichern der isolierten Objekte nach der Segmentierung?#
Es gibt zwei Hauptstile. Konvertiere die Maske für einen schwarzen Hintergrund in drei Kanäle und verwende cv2.bitwise_and(). Staple die Maske für einen transparenten Hintergrund (beim Speichern als PNG) als vierten Alpha-Kanal mit np.dstack([img, b_mask]). Beide werden unter Isolate the Object gezeigt.
Wie 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 Ergebnisse von Begrenzungsrahmen in der Dokumentation zum Predict Mode.
Warum 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.
Kann ich isolierte Objekte inklusive Hintergrund mit Ultralytics YOLO speichern?#
Ja. Verwende das Argument save_crop in predict(), um Begrenzungsrahmen-Zuschnitte mit ihrem Originalhintergrund zu speichern:
results = model.predict(source="path/to/your/image.jpg", save_crop=True)Lies mehr im Abschnitt Predict Mode Inference Arguments.