Meet YOLO26: next-gen vision AI.

Link to this sectionCome isolare oggetti di segmentazione con Ultralytics YOLO#

La segmentazione delle istanze produce una maschera pixel-precisa per ogni oggetto rilevato, il che significa che puoi estrarre ogni oggetto da un'immagine separatamente. Questa guida ti mostra come trasformare i risultati di segmentazione di Ultralytics YOLO in oggetti isolati utilizzando la Modalità Predittiva e OpenCV, con uno sfondo nero solido o trasparente per il salvataggio in formato PNG.



Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀

Link to this sectionPerché isolare gli oggetti di segmentazione?#

Estrarre singoli oggetti da un'immagine apre una serie di flussi di lavoro a valle:

  • Rimozione dello sfondo per foto di prodotti, cataloghi o editing creativo.
  • Ritagli per oggetto per costruire dataset di classificazione dalle tue rilevazioni.
  • Elaborazione mirata affinché i passaggi successivi, come OCR, analisi del colore o misurazioni, vedano solo l'oggetto e non la scena circostante.
  • Esportazione PNG trasparente per comporre oggetti su nuovi sfondi.

La procedura funziona con qualsiasi modello di segmentazione Ultralytics YOLO e segue quattro fasi: esegui inferenzaestrai ogni contornoisola l'oggettosalva il risultato.

Link to this sectionEsegui inferenza di segmentazione#

Installa le librerie necessarie, poi carica un modello di segmentazione (il suffisso -seg, richiesto per produrre maschere) ed esegui la predizione sulla tua immagine sorgente:

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")
Nessuna sorgente? YOLO utilizza le immagini campione incluse

Se chiami model.predict() senza una source, Ultralytics ricorre alle immagini di esempio fornite con il pacchetto (bus.jpg e zidane.jpg), il che è utile per testare rapidamente il flusso di lavoro.

Link to this sectionEstrai contorni oggetto#

Ogni elemento in results corrisponde a un'immagine e l'iterazione su un risultato restituisce una rilevazione alla volta. Per ogni rilevazione, copia l'immagine originale, leggi l'etichetta della classe e disegna il contorno della maschera dell'oggetto su una maschera binaria vuota. La regione bianca di questa maschera segna esattamente quali pixel appartengono all'oggetto.

Gli snippet in questa sezione e nella successiva vengono eseguiti all'interno del ciclo di rilevazione sottostante; lo script completo, pronto da copiare, è in Esempio Completo.

Immagine Maschera Binaria{ 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)
Cosa fa `c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)`?
  • c.masks.xy[0] restituisce il contorno della maschera come coordinate di punti (x, y) per l'oggetto in questo singolo risultato di rilevazione.
  • .astype(np.int32) converte i punti da float32, formato che drawContours() di OpenCV non accetta.
  • .reshape(-1, 1, 2) rimodella i punti nel layout [N, 1, 2] previsto da drawContours(), dove N è il numero di punti del contorno.

Passare [contour] con l'indice -1 disegna tutti i punti del contorno fornito e cv2.FILLED riempie di bianco ogni pixel racchiuso.

Link to this sectionIsola l'oggetto#

Con la maschera binaria pronta, combinala con l'immagine originale. Esistono due stili comuni, a seconda di quale sfondo desideri:

Scegli uno stile di isolamento

Converti la maschera in tre canali e mantieni solo i pixel che si sovrappongono all'oggetto. Tutto ciò che è esterno al contorno diventa nero:

# 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](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/full-size-isolated-object-black-background.avif){ width=240 }
Full-size object on a black background
Ritaglia al riquadro di delimitazione

Per mantenere solo la regione dell'oggetto anziché l'immagine a dimensione intera, ritagliala al riquadro di delimitazione della rilevazione:

# 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](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/example-crop-isolated-object-image-black-background.avif){ width=240 }
Object cropped to its bounding box
Ti serve il ritaglio con lo sfondo originale?

È già integrato. Passa save_crop=True a predict() e Ultralytics salverà automaticamente i ritagli dei riquadri di delimitazione, senza bisogno di maschere.

Link to this sectionSalva il risultato (opzionale)#

Cosa fare con ogni oggetto isolato dipende da te. Un passaggio successivo comune è salvarlo su disco per un uso futuro:

# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

Qui img_name è il nome base dell'immagine sorgente, label è il nome della classe e ci è l'indice di rilevazione, in modo che più istanze della stessa classe ottengano nomi file univoci. Sostituisci isolated con iso_crop se hai applicato il ritaglio opzionale sopra.

Link to this sectionEsempio Completo#

Lo script sottostante combina ogni passaggio in un unico blocco eseguibile. Utilizza uno sfondo nero per impostazione predefinita; sostituisci la riga contrassegnata con np.dstack([img, b_mask]) per ottenere un PNG trasparente:

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])

Per un uso ripetuto, racchiudi il corpo del ciclo in una funzione così da poterlo richiamare su molte immagini.

Link to this sectionConclusione#

Ora hai una ricetta completa per isolare oggetti segmentati con Ultralytics YOLO: esegui l'inferenza, costruisci una maschera binaria da ogni contorno, quindi estrai l'oggetto su uno sfondo nero o trasparente e, opzionalmente, ritaglialo al suo riquadro di delimitazione. Esplora la documentazione completa su Attività di Segmentazione e Modalità Predittiva per adattare il flusso di lavoro alle tue classi.

Link to this sectionFAQ#

Link to this sectionCome isolo gli oggetti usando Ultralytics YOLO per attività di segmentazione?#

Carica un modello di segmentazione, esegui l'inferenza, costruisci una maschera binaria dal contorno di ogni rilevazione e combinala con l'immagine originale:

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)

Vedi l'Esempio Completo per il ciclo per-rilevazione completo.

Link to this sectionQuali opzioni sono disponibili per salvare gli oggetti isolati dopo la segmentazione?#

Ci sono due stili principali. Per uno sfondo nero, converti la maschera in tre canali e usa cv2.bitwise_and(). Per uno sfondo trasparente (quando salvi come PNG), sovrapponi la maschera come quarto canale alfa con np.dstack([img, b_mask]). Entrambi sono mostrati in Isola l'oggetto.

Link to this sectionCome posso ritagliare gli oggetti isolati ai loro riquadri di delimitazione?#

Leggi le coordinate del riquadro di delimitazione dalla rilevazione e ritaglia l'immagine isolata:

x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]

Scopri di più sui risultati dei riquadri di delimitazione nella documentazione della Modalità Predittiva.

Link to this sectionPerché dovrei usare Ultralytics YOLO per l'isolamento di oggetti in attività di segmentazione?#

Ultralytics YOLO offre una segmentazione delle istanze veloce e in tempo reale con generazione accurata di maschere e riquadri di delimitazione, oltre a una semplice API Python che trasforma i risultati dell'inferenza in oggetti isolati in poche righe di codice OpenCV.

Link to this sectionPosso salvare oggetti isolati includendo lo sfondo usando Ultralytics YOLO?#

Sì. Usa l'argomento save_crop in predict() per salvare ritagli basati sui riquadri di delimitazione con il loro sfondo originale:

results = model.predict(source="path/to/your/image.jpg", save_crop=True)

Leggi di più nella sezione Argomenti dell'Inferenza della Modalità Predittiva.

Commenti