Meet YOLO26: next-gen vision AI.

Link to this sectionComo isolar objetos de segmentação com Ultralytics YOLO#

Segmentação de instâncias produz uma máscara de precisão de pixel para cada objeto detectado, o que significa que podes extrair cada objeto de uma imagem separadamente. Este guia mostra-te como transformar resultados de segmentação do Ultralytics YOLO em objetos isolados usando Modo de Predição e OpenCV, com um fundo preto sólido ou transparente para guardar como PNG.



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

Link to this sectionPor que isolar objetos de segmentação?#

Extrair objetos individuais de uma imagem abre uma gama de fluxos de trabalho posteriores:

  • Remoção de fundo para fotos de produtos, catálogos ou edição criativa.
  • Recortes por objeto para criar conjuntos de dados de classificação a partir das tuas detecções.
  • Processamento focado para que etapas posteriores, como OCR, análise de cores ou medição, vejam apenas o objeto, não a cena circundante.
  • Exportação de PNG transparente para compor objetos em novos fundos.

A receita funciona com qualquer modelo de segmentação Ultralytics YOLO e segue quatro etapas: executar inferênciaextrair cada contornoisolar o objetoguardar o resultado.

Link to this sectionExecutar inferência de segmentação#

Instala as bibliotecas necessárias, carrega um modelo de segmentação (o sufixo -seg, necessário para produzir máscaras) e executa a predição na tua imagem de origem:

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")
Sem fonte? O YOLO usa as imagens de amostra incluídas

Se chamares model.predict() sem uma source, o Ultralytics recorre às imagens de exemplo fornecidas com o pacote (bus.jpg e zidane.jpg), o que é útil para testar rapidamente o fluxo de trabalho.

Link to this sectionExtrair contornos de objetos#

Cada item em results corresponde a uma imagem, e iterar sobre um resultado produz uma detecção de cada vez. Para cada detecção, copia a imagem original, lê o rótulo da classe e desenha o contorno da máscara do objeto numa máscara binária em branco. A região branca desta máscara marca exatamente quais pixels pertencem ao objeto.

Os trechos nesta secção e na próxima são executados dentro do ciclo de detecção abaixo; o script completo para copiar e colar está em Exemplo Completo.

Imagem de máscara binária{ 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)
O que faz `c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)`?
  • c.masks.xy[0] retorna o contorno da máscara como coordenadas de ponto (x, y) para o objeto neste resultado de detecção única.
  • .astype(np.int32) converte os pontos de float32, que o drawContours() do OpenCV não aceita.
  • .reshape(-1, 1, 2) reformata os pontos para o layout [N, 1, 2] que o drawContours() espera, onde N é o número de pontos do contorno.

Passar [contour] com o índice -1 desenha todos os pontos do contorno fornecido, e cv2.FILLED preenche cada pixel envolvido a branco.

Link to this sectionIsolar o objeto#

Com a máscara binária pronta, combina-a com a imagem original. Existem dois estilos comuns, dependendo de como queres que o fundo seja:

Escolhe um estilo de isolamento

Converte a máscara para três canais e mantém apenas os pixels que se sobrepõem ao objeto. Tudo fora do contorno torna-se preto:

# 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
Recortar para a caixa delimitadora

Para manter apenas a região do objeto em vez da imagem em tamanho original, corta-a para a caixa delimitadora da detecção:

# 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
Precisas do recorte com o seu fundo original?

Isso já está integrado. Passa save_crop=True para predict() e o Ultralytics guarda recortes da caixa delimitadora automaticamente, sem necessidade de máscara.

Link to this sectionGuardar o resultado (opcional)#

O que fazes com cada objeto isolado depende de ti. Um próximo passo comum é escrevê-lo em disco para uso posterior:

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

Aqui img_name é o nome da imagem de origem, label é o nome da classe e ci é o índice de detecção, para que múltiplas instâncias da mesma classe tenham nomes de ficheiro únicos. Troca isolated por iso_crop se tiveres aplicado o recorte opcional acima.

Link to this sectionExemplo Completo#

O script abaixo combina cada etapa num único bloco executável. Ele usa um fundo preto por padrão; troca a linha marcada para np.dstack([img, b_mask]) para um PNG transparente:

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

Para uso repetido, envolve o corpo do ciclo numa função para que possas chamá-la em muitas imagens.

Link to this sectionConclusão#

Tens agora uma receita completa para isolar objetos segmentados com Ultralytics YOLO: executa a inferência, cria uma máscara binária a partir de cada contorno, depois extrai o objeto num fundo preto ou transparente e, opcionalmente, corta-o para a sua caixa delimitadora. Explora a documentação completa de Tarefa de Segmentação e Modo de Predição para adaptar o fluxo de trabalho às tuas próprias classes.

Link to this sectionFAQ#

Link to this sectionComo posso isolar objetos usando Ultralytics YOLO para tarefas de segmentação?#

Carrega um modelo de segmentação, executa a inferência, cria uma máscara binária a partir do contorno de cada detecção e combina-a com a imagem original:

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)

Vê o Exemplo Completo para o ciclo completo por detecção.

Link to this sectionQue opções estão disponíveis para guardar os objetos isolados após a segmentação?#

Existem dois estilos principais. Para um fundo preto, converte a máscara para três canais e usa cv2.bitwise_and(). Para um fundo transparente (ao guardar como PNG), empilha a máscara como um quarto canal alfa com np.dstack([img, b_mask]). Ambos são mostrados em Isolar o Objeto.

Link to this sectionComo posso recortar objetos isolados para as suas caixas delimitadoras?#

Lê as coordenadas da caixa delimitadora da detecção e corta a imagem isolada:

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

Sabe mais sobre resultados de caixas delimitadoras na documentação do Modo de Predição.

Link to this sectionPor que devo usar Ultralytics YOLO para isolamento de objetos em tarefas de segmentação?#

O Ultralytics YOLO oferece segmentação de instâncias em tempo real e rápida, com geração precisa de máscaras e caixas delimitadoras, além de uma API Python simples que transforma resultados de inferência em objetos isolados em poucas linhas de código OpenCV.

Link to this sectionPosso guardar objetos isolados incluindo o fundo usando Ultralytics YOLO?#

Sim. Usa o argumento save_crop em predict() para guardar recortes de caixas delimitadoras com o seu fundo original:

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

Lê mais na secção Argumentos de Inferência do Modo de Predição.

Comentários