Ultralytics YOLO27:

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ührenjede Kontur extrahierendas Objekt isolierendas 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")
Keine Quelle? YOLO verwendet die enthaltenen Beispielbilder

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.

Binary Mask Image
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)
Was bewirkt `c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)`?
  • 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 aus float32, die OpenCVs drawContours() nicht akzeptiert.
  • .reshape(-1, 1, 2) formt die Punkte in das Layout [N, 1, 2] um, das drawContours() erwartet, wobei N die 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:

Isolierungsvariante auswählen

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)
Example Full size Isolated Object Image Black Background
Full-size object on a black background
Auf die Bounding Box zuschneiden

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]
Example Crop Isolated Object Image Black Background
Object cropped to its bounding box
Brauchst du den Ausschnitt mit seinem ursprünglichen Hintergrund?

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 mit np.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_crop in predict(), 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.

Kommentare