🔗 Repositório GitHub: https://github.com/Lucsvieirabr/Segmenta-o-Python.git
- Visão Geral
- Estrutura do Projeto
- Instalação e Configuração
- Como Executar
- Detalhamento Técnico
- Escolha das Bibliotecas
- Algoritmos Implementados
- Resultados Esperados
- Análise e Discussão
- Conclusões
Este projeto implementa duas técnicas principais de processamento de imagens:
- Segmentação de maçãs e objetos em imagens usando K-means
- Comparação entre segmentação em espaço RGB (3D) e RGB+XY (5D)
- Visualização 3D dos clusters no espaço RGB
- Detecção de pele usando thresholding de cor em espaço HSV
- Segmentação semeadora (seeded segmentation) para extração de regiões de rosto
M2_PYTHON/
│
├── images/ # Diretório com imagens de entrada
│ ├── 2apples.jpg # Imagem de 2 maçãs
│ ├── 7apples.jpg # Imagem de 7 maçãs
│ ├── variableObjects.jpeg # Imagem com objetos variáveis
│ ├── 2or4objects.jpg # Imagem com 2 ou 4 objetos
│ ├── face1.jpg # Face 1 para detecção
│ ├── face2.jpg # Face 2 para detecção
│ ├── face3.jpeg # Face 3 para detecção
│ └── face4.jpg # Face 4 para detecção
│
├── results/ # Diretório para resultados (criado automaticamente)
│ ├── segmentacao_*.png # Resultados da segmentação K-means
│ ├── dispersao_3d_*.png # Gráficos 3D de dispersão RGB
│ ├── deteccao_*_thresholding.png # Resultados do thresholding
│ ├── deteccao_*_seeded.png # Resultados da segmentação semeadora
│ └── DISCUSSAO.txt # Análise e discussão dos resultados
│
├── main.py # Arquivo principal de execução
├── segmentacao_kmeans.py # Módulo de segmentação K-means
├── deteccao_rosto.py # Módulo de detecção de rosto
├── requirements.txt # Dependências do projeto
└── README.md # Este arquivo
- Python 3.8 ou superior
- pip (gerenciador de pacotes Python)
cd "/home/lucas/Área de trabalho/M2_PYTHON"python3 -m venv venvIsso cria um ambiente virtual isolado que evita conflitos com outras instalações Python.
Por que usar ambiente virtual?
- Isola as dependências do projeto
- Evita conflitos com outras bibliotecas instaladas globalmente
- Permite diferentes versões de bibliotecas para diferentes projetos
- Facilita o compartilhamento do projeto
No Linux/Mac:
source venv/bin/activateNo Windows:
venv\Scripts\activateQuando ativado, você verá (venv) no início do prompt do terminal.
pip install -r requirements.txtIsso instalará todas as bibliotecas necessárias:
numpy- Operações numéricas e arrays multidimensionaisopencv-python- Processamento de imagensmatplotlib- Visualização e gráficosscikit-learn- Algoritmos de machine learning (K-means)
python -c "import cv2, numpy, matplotlib, sklearn; print('Todas as bibliotecas instaladas!')"No Linux/Mac:
source venv/bin/activateNo Windows:
venv\Scripts\activateQuando ativado, você verá (venv) no início do prompt do terminal.
python main.pydeactivateSe preferir instalar globalmente (pode conflitar com outros projetos):
pip3 install --break-system-packages -r requirements.txt
python3 main.py-
Projeto 1 - Segmentação K-means:
- Processa 4 imagens de maçãs/objetos
- Aplica K-means em RGB (3D) e RGB+XY (5D)
- Gera gráfico 3D para
2or4objects.jpg - Salva resultados em
results/
-
Projeto 2 - Detecção de Rosto:
- Processa 4 imagens de faces
- Aplica thresholding de cor de pele (HSV)
- Aplica segmentação semeadora
- Salva resultados em
results/
-
Análise e Discussão:
- Gera arquivo
results/DISCUSSAO.txtcom análises
- Gera arquivo
Todos os resultados são salvos automaticamente no diretório results/:
segmentacao_[imagem]_K[K]_RGB.png- Segmentação RGB (3 dimensões)segmentacao_[imagem]_K[K]_RGB+XY.png- Segmentação RGB+XY (5 dimensões)dispersao_3d_K[K]clusters.png- Gráfico 3D (apenas para2or4objects.jpg)
deteccao_[imagem]_thresholding.png- Detecção por thresholding de cordeteccao_[imagem]_seeded.png- Detecção por segmentação semeadora
DISCUSSAO.txt- Análise e discussão dos resultados (comparações RGB vs RGB+XY e métricas de segmentação)
Exemplo de arquivos gerados:
results/
├── segmentacao_2apples_K3_RGB.png
├── segmentacao_2apples_K3_RGB+XY.png
├── segmentacao_7apples_K8_RGB.png
├── segmentacao_7apples_K8_RGB+XY.png
├── segmentacao_variableObjects_K5_RGB.png
├── segmentacao_variableObjects_K5_RGB+XY.png
├── segmentacao_2or4objects_K5_RGB.png
├── segmentacao_2or4objects_K5_RGB+XY.png
├── dispersao_3d_5clusters.png
├── deteccao_face1_thresholding.png
├── deteccao_face1_seeded.png
├── deteccao_face2_thresholding.png
├── deteccao_face2_seeded.png
├── deteccao_face3_thresholding.png
├── deteccao_face3_seeded.png
├── deteccao_face4_thresholding.png
├── deteccao_face4_seeded.png
└── DISCUSSAO.txt
Durante a execução, o programa exibe no terminal:
- Qual imagem está sendo processada
- Valor de K usado para cada imagem
- Método aplicado (RGB, RGB+XY, thresholding, seeded)
- Caminho onde cada resultado foi salvo
- Seed point encontrado para segmentação semeadora
Exemplo de saída:
============================================================
PROJETO 1: Segmentação de Maçãs com K-means
============================================================
Processando: images/2apples.jpg
Usando K=3 clusters
- Segmentação RGB (3 dimensões)...
Resultado salvo em: results/segmentacao_2apples_K3_RGB.png
- Segmentação RGB+XY (5 dimensões)...
Resultado salvo em: results/segmentacao_2apples_K3_RGB+XY.png
Erro: "No module named 'cv2'" ou outros módulos não encontrados
- Solução: Certifique-se de que o ambiente virtual está ativado e as dependências estão instaladas
source venv/bin/activate pip install -r requirements.txt
Erro: "Permission denied" ao salvar resultados
- Solução: Verifique as permissões do diretório
results/ou crie manualmente:mkdir -p results chmod 755 results
Imagens não são encontradas
- Solução: Verifique se todas as imagens estão no diretório
images/com os nomes corretos conforme listados emmain.py
Resultados não são salvos
- Solução: Verifique se o diretório
results/existe e tem permissões de escrita
Arquivo principal que orquestra a execução dos dois projetos.
O que faz:
- Cria uma figura com duas imagens lado a lado
- Exibe a imagem original e a segmentada para comparação visual
- Salva o resultado em arquivo PNG no diretório
results/
Parâmetros:
imagem_original: Imagem RGB original (array NumPy)imagem_segmentada: Imagem RGB segmentada pelo K-meansnome_arquivo: Caminho do arquivo original (para extrair nome)K: Número de clusters usadotipo: Tipo de segmentação ('RGB' ou 'RGB+XY')
Por que criar essa função?
- Padroniza a forma de salvar resultados
- Facilita comparação visual lado a lado
- Organiza os arquivos de saída de forma clara
O que faz:
- Cria uma figura com 3 imagens em linha
- Exibe: original, máscara binária, resultado da detecção
- Salva o resultado em arquivo PNG
Parâmetros:
imagem_original: Imagem RGB originalimagem_segmentada: Imagem com apenas região detectada destacadamascara: Máscara binária (0 ou 255) da região detectadanome_arquivo: Caminho do arquivo originalmetodo: Método usado ('thresholding' ou 'seeded')
Visualização em 3 painéis:
- Original: Imagem como está
- Máscara: Visualização binária da região detectada (preto/branco)
- Resultado: Imagem original com apenas a região detectada colorida
O que faz:
- Itera sobre todas as imagens de maçãs/objetos definidas em
IMAGENS_MACAS - Para cada imagem:
- Obtém o valor de K apropriado do dicionário
K_VALUES - Carrega a imagem original
- Chama
segmentar_kmeans()duas vezes (RGB e RGB+XY) - Salva resultados usando
salvar_resultado_segmentacao() - Gera gráfico 3D apenas para
2or4objects.jpg
- Obtém o valor de K apropriado do dicionário
Lógica de valores de K:
2apples.jpg→ K=3 (fundo + 2 maçãs)7apples.jpg→ K=8 (fundo + 7 maçãs)variableObjects.jpeg→ K=5 (fundo + alguns objetos)2or4objects.jpg→ K=5 (fundo + objetos variáveis)
Por que diferentes valores de K?
- K deve corresponder ao número de regiões distintas na imagem
- Muito baixo: objetos diferentes podem ser agrupados
- Muito alto: mesmo objeto pode ser dividido em múltiplos clusters
O que faz:
- Itera sobre todas as imagens de faces em
IMAGENS_FACES - Para cada imagem:
- Aplica
skin_color_thresholding()para método de thresholding - Aplica
seeded_segmentation()com seed point encontrado automaticamente - Salva resultados de ambos os métodos
- Aplica
Fluxo:
- Carrega imagem de face
- Aplica thresholding de cor → obtém máscara binária
- Encontra seed point automaticamente na região de pele detectada
- Aplica segmentação semeadora a partir do seed point
- Salva ambos os resultados para comparação
O que faz:
- Gera uma discussão textual sobre:
- Comparação entre RGB vs RGB+XY no K-means
- Métricas de avaliação para segmentação (IoU, Dice, etc.)
- Salva discussão em
results/DISCUSSAO.txt - Também imprime no terminal
Módulo responsável pela segmentação usando K-means clustering.
O que faz:
- Carrega e prepara a imagem
- Extrai features dependendo do
dim_type - Aplica algoritmo K-means usando scikit-learn
- Retorna imagem segmentada, labels e centros dos clusters
Detalhamento do Processo:
- Carregamento da Imagem:
image = cv2.imread(image_path) # Carrega em BGR
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # Converte para RGB- OpenCV carrega imagens em formato BGR (Blue-Green-Red)
- Convertemos para RGB para compatibilidade com matplotlib e padrão usual
- Extração de Features - Caso A (RGB):
pixels = image_rgb.reshape((-1, 3)) # (height*width, 3)
features = pixels.astype(np.float32)- Redimensiona de (height, width, 3) para (N_pixels, 3)
- Cada linha representa um pixel com valores [R, G, B]
- 3 dimensões: R, G, B
- Extração de Features - Caso B (RGB+XY):
y_coords, x_coords = np.mgrid[0:height, 0:width] # Matrizes de coordenadas
x_coords_norm = x_coords.flatten() / width # Normaliza X para [0, 1]
y_coords_norm = y_coords.flatten() / height # Normaliza Y para [0, 1]
# Combina RGB + coordenadas normalizadas escaladas para [0, 255]
features = np.hstack([
pixels.astype(np.float32),
x_coords_norm.reshape(-1, 1) * 255,
y_coords_norm.reshape(-1, 1) * 255
])- 5 dimensões: R, G, B, X, Y
- Coordenadas são normalizadas e escaladas para [0, 255] para balancear com RGB
- Por que normalizar? Evita que coordenadas dominem o clustering
- Aplicação do K-means:
kmeans = KMeans(n_clusters=K, random_state=42, n_init=10)
labels = kmeans.fit_predict(features)n_clusters=K: Número de clusters desejadorandom_state=42: Seed para reprodutibilidaden_init=10: Executa K-means 10 vezes e escolhe melhor resultado
- Construção da Imagem Segmentada:
labels_reshaped = labels.reshape(height, width) # Volta para forma 2D
imagem_segmentada = np.zeros_like(image_rgb)
for i in range(K):
mask = labels_reshaped == i
imagem_segmentada[mask] = centers_rgb[i] # Substitui por cor do centro- Cada pixel recebe a cor do centro do seu cluster
- Resultado: imagem com K cores distintas
Retorno:
imagem_segmentada: Array NumPy (height, width, 3) com cores dos centroslabels: Array NumPy 1D com rótulo de cluster de cada pixelcenters_rgb: Array NumPy (K, 3) com cores RGB dos centros dos clusters
O que faz:
- Cria gráfico de dispersão 3D no espaço RGB
- Mostra como os pixels estão distribuídos e agrupados
- Visualiza os centros dos clusters
Restrição: Apenas para images/2or4objects.jpg (conforme especificação)
Detalhamento:
- Verificação de Imagem:
if '2or4objects.jpg' not in image_path:
print("AVISO: plot_dispersao_3d deve ser usado apenas para images/2or4objects.jpg")
return- Preparação dos Dados:
pixels = image_rgb.reshape((-1, 3)) # Todos os pixels RGB
# Amostra para performance (visualizar 50k pixels é suficiente)
sample_size = min(50000, len(pixels))
indices = np.random.choice(len(pixels), sample_size, replace=False)
pixels_sample = pixels[indices]
labels_sample = labels_flat[indices]- Por que amostrar? Gráficos com milhões de pontos são lentos
- 50.000 pixels são suficientes para visualizar a distribuição
- Criação do Gráfico 3D:
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, projection='3d')
# Plota pixels de cada cluster com cor diferente
for i in range(K):
cluster_pixels = pixels_sample[labels_sample == i]
ax.scatter(cluster_pixels[:, 0], # R
cluster_pixels[:, 1], # G
cluster_pixels[:, 2], # B
label=f'Cluster {i+1}',
alpha=0.3, s=1) # Transparência e tamanho pequeno
# Plota centros dos clusters em preto (X)
ax.scatter(centers[:, 0], centers[:, 1], centers[:, 2],
c='black', marker='x', s=200, label='Centros')- Eixos: R (vermelho), G (verde), B (azul)
- Cada cluster tem cor diferente
- Centros marcados com X preto grande
- Salvamento:
output_path = f"results/dispersao_3d_{K}clusters.png"
plt.savefig(output_path, dpi=150, bbox_inches='tight')Interpretação do Gráfico:
- Clusters bem separados: boa segmentação
- Clusters sobrepostos: cores similares, pode ser difícil separar
- Centros no meio dos clusters: algoritmo convergiu bem
Módulo responsável pela detecção de rostos usando técnicas de segmentação.
O que faz:
- Detecta regiões de pele humana usando thresholding baseado em cor
- Usa espaço de cores HSV (não RGB!)
- Retorna imagem original, imagem segmentada e máscara binária
Por que HSV é melhor que RGB?
HSV (Hue-Saturation-Value) separa:
- H (Hue/Matiz): A cor pura (0-360° ou 0-180 em OpenCV)
- S (Saturation): Intensidade da cor (0-255)
- V (Value): Brilho/Luminosidade (0-255)
Vantagens do HSV:
- Robustez à iluminação: Matiz (H) muda pouco com variação de luz
- Intuitividade: Mais próximo da percepção humana de cor
- Thresholding eficiente: Faixas de matiz para pele são estreitas
- Separação: Cor e luminosidade são independentes
Processo Detalhado:
- Conversão para HSV:
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)- Definição de Intervalos de Cor de Pele:
lower_skin = np.array([0, 48, 89], dtype=np.uint8) # HSV mínimo
upper_skin = np.array([50, 255, 255], dtype=np.uint8) # HSV máximoInterpretação dos intervalos:
-
H (Hue): 0-50
- Cobre tons de vermelho a amarelo (tons de pele)
- Humanos têm pele em faixa estreita de matiz
-
S (Saturation): 48-255
- Evita cores muito esbranquiçadas (baixa saturação)
- Pele tem saturação moderada a alta
-
V (Value): 89-255
- Evita sombras muito escuras
- Pele tem brilho moderado a alto
- Aplicação do Thresholding:
mask = cv2.inRange(image_hsv, lower_skin, upper_skin)cv2.inRange()cria máscara binária:- 255 (branco) para pixels dentro do intervalo
- 0 (preto) para pixels fora do intervalo
- Operações Morfológicas:
kernel = np.ones((5, 5), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # Remove ruídos
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # Preenche buracosMORPH_OPEN (Abertura):
- Remove pequenos ruídos (pixels isolados)
- Erosão seguida de dilatação
MORPH_CLOSE (Fechamento):
- Preenche pequenos buracos dentro da região
- Dilatação seguida de erosão
Por que fazer isso?
- Thresholding pode gerar ruído (pixels isolados classificados como pele)
- Operações morfológicas suavizam a máscara
- Aplicação da Máscara:
imagem_segmentada = cv2.bitwise_and(image_rgb, image_rgb, mask=mask)cv2.bitwise_and()aplica máscara: pixels fora da máscara ficam pretos
Retorno:
image_rgb: Imagem original em RGBimagem_segmentada: Imagem com apenas pixels de pele destacadosmask: Máscara binária (0 ou 255)
O que faz:
- Segmentação semeadora (region growing) a partir de um ponto inicial
- Expandindo região baseado em similaridade de intensidade
- Usa média em execução para adaptar o crescimento
Algoritmo de Region Growing:
- Inicialização:
queue = deque([(x, y)]) # Fila de pixels a processar
mask[y, x] = 255 # Marca seed como visitado
seed_intensity = float(gray[y, x]) # Intensidade inicial
running_mean = seed_intensity # Média em execução
count = 1 # Contador de pixels na região- Processamento Iterativo:
while queue:
cx, cy = queue.popleft() # Pega próximo pixel da fila
# Verifica vizinhos (8-conectados)
for dx, dy in directions:
nx, ny = cx + dx, cy + dy
# Verifica se está dentro da tolerância
if abs(neighbor_intensity - running_mean) <= tolerance:
# Adiciona à região
mask[ny, nx] = 255
queue.append((nx, ny))
# Atualiza média em execução
running_mean = (running_mean * count + neighbor_intensity) / (count + 1)
count += 1Detalhes Importantes:
-
8-conectados: Verifica 8 vizinhos (norte, sul, leste, oeste, diagonais)
-
Média em execução: Adapta o limiar conforme a região cresce
- Inicia com intensidade do seed
- Atualiza conforme novos pixels são adicionados
- Permite seguir gradientes suaves
-
Tolerância (30):
- Diferença máxima de intensidade permitida
- Muito baixa: região não cresce
- Muito alta: pode incluir áreas diferentes
Por que usar média em execução?
- Pele não tem intensidade uniforme (iluminação varia)
- Média em execução permite seguir variações graduais
- Melhor que usar intensidade fixa do seed
O que faz:
- Encontra automaticamente um ponto na região de pele
- Usa thresholding para detectar pele primeiro
- Retorna centroide da maior região de pele
Processo:
- Aplica thresholding de pele
- Encontra contornos (regiões conectadas)
- Seleciona maior contorno (geralmente a face)
- Calcula centroide usando momentos
- Retorna coordenadas (x, y) do centroide
Por que automatizar?
- Evita seleção manual de seed point
- Mais prático para processar múltiplas imagens
- Seed no centro da face geralmente funciona bem
O que faz:
- Arrays multidimensionais eficientes
- Operações matemáticas vetorizadas
- Base para muitas bibliotecas de Python
Por que escolher?
- Performance: Operações vetorizadas são muito mais rápidas que loops
- Eficiência de memória: Arrays NumPy são compactos
- Comunidade: Padrão da indústria, muito documentado
- Integração: Todas as outras bibliotecas usam NumPy internamente
Uso no projeto:
- Armazenar imagens como arrays (height, width, channels)
- Operações matemáticas em pixels
- Manipulação de coordenadas e features
O que faz:
- Processamento de imagens e visão computacional
- Carregamento/salvamento de imagens
- Transformações de espaço de cores
- Operações morfológicas
- Detecção de contornos
Por que escolher?
- Completo: Tudo que precisamos para processamento de imagens
- Otimizado: Implementações em C++, muito rápido
- Amplamente usado: Padrão da indústria
- Documentação: Excelente documentação e exemplos
Uso no projeto:
cv2.imread(): Carregar imagenscv2.cvtColor(): Converter espaços de cores (BGR→RGB, BGR→HSV)cv2.inRange(): Thresholding baseado em intervalocv2.morphologyEx(): Operações morfológicascv2.findContours(): Encontrar contornos para seed automático
O que faz:
- Visualização de dados e gráficos
- Plotagem de imagens
- Gráficos 2D e 3D
- Exportação para PNG, PDF, etc.
Por que escolher?
- Flexível: Diferentes tipos de gráficos
- Compatível: Funciona bem com NumPy e imagens
- Controlável: Controle fino sobre aparência
- Padrão: Biblioteca padrão para visualização em Python
Uso no projeto:
plt.imshow(): Exibir imagensplt.scatter(): Gráfico de dispersão 3Dplt.subplots(): Múltiplas imagens em uma figuraplt.savefig(): Salvar resultados
O que faz:
- Algoritmos de machine learning
- Inclui K-means clustering otimizado
- Implementações eficientes e testadas
Por que escolher?
- K-means otimizado: Implementação eficiente com várias otimizações
- Confiança: Biblioteca amplamente usada e testada
- Facilidade: API simples e intuitiva
- Performance: Implementações otimizadas em C/Cython
Uso no projeto:
KMeans: Classe para K-means clusteringfit_predict(): Treinar e obter labels em uma chamada
Alternativas consideradas:
- Implementar K-means do zero: mais educativo, mas menos eficiente
- Outras bibliotecas: scikit-learn é padrão e suficiente
Conceito: Algoritmo de clustering não-supervisionado que agrupa dados em K clusters.
Funcionamento:
- Inicialização: Escolhe K centros aleatórios (ou usando K-means++)
- Atribuição: Cada ponto é atribuído ao centro mais próximo
- Atualização: Centros são recalculados como média dos pontos do cluster
- Iteração: Repete 2 e 3 até convergência (centros não mudam)
Matematicamente:
-
Distância: Usa distância euclidiana
d(p, c) = √[(R_p - R_c)² + (G_p - G_c)² + (B_p - B_c)²] -
Atualização de centros:
c_k = (1/|C_k|) * Σ p_i, para p_i ∈ C_k -
RGB+XY: Adiciona coordenadas à distância:
d(p, c) = √[(R_p-R_c)² + (G_p-G_c)² + (B_p-B_c)² + (X_p-X_c)² + (Y_p-Y_c)²]
Por que normalizar coordenadas?
- RGB varia em [0, 255], coordenadas X/Y podem ser 0-1000+
- Sem normalização, coordenadas dominariam o clustering
- Normalizando e escalando para [0, 255], RGB e XY têm peso similar
Complexidade:
- Tempo: O(n * K * d * i) onde n=pixels, K=clusters, d=dimensões, i=iterações
- Espaço: O(n * d) para armazenar features
Conceito: Algoritmo de segmentação que cresce uma região a partir de um ponto inicial (seed).
Funcionamento:
- Seed: Ponto inicial na região desejada
- Crescimento: Adiciona vizinhos se similaridade > threshold
- Parada: Quando não há mais vizinhos similares
Critério de Similaridade:
|I(vizinho) - média_atual| ≤ tolerância
Vizinhos 8-conectados:
[-1, -1] [-1, 0] [-1, 1]
[ 0, -1] [ 0, 1]
[ 1, -1] [ 1, 0] [ 1, 1]
Média em Execução:
- Inicia com intensidade do seed
- Cada novo pixel atualiza a média:
média_nova = (média_antiga * n + I_novo) / (n + 1) - Permite seguir gradientes graduais
Vantagens:
- Simples de implementar
- Adapta-se a variações graduais de intensidade
- Controle fino via tolerância
Desvantagens:
- Depende da escolha do seed point
- Pode "vazar" para regiões similares
- Sensível ao valor de tolerância
Conceito: Classificação binária: pixel pertence ou não à região (ex: pele).
Espaço de Cores HSV:
Conversão RGB → HSV:
- Baseada em transformação não-linear
- Separa matiz, saturação e valor
Thresholding:
Para cada pixel:
Se (H_min ≤ H ≤ H_max) AND (S_min ≤ S ≤ S_max) AND (V_min ≤ V ≤ V_max):
pixel = REGIÃO (255)
Senão:
pixel = FORA (0)
Intervalos para Pele Humana:
- Pesquisa mostra pele humana em faixa estreita de matiz
- H: 0-50 (tons vermelho a amarelo)
- S: 48-255 (saturação moderada a alta)
- V: 89-255 (brilho moderado a alto)
results/
├── segmentacao_2apples_K3_RGB.png # Segmentação RGB (2 maçãs)
├── segmentacao_2apples_K3_RGB+XY.png # Segmentação RGB+XY (2 maçãs)
├── segmentacao_7apples_K8_RGB.png # Segmentação RGB (7 maçãs)
├── segmentacao_7apples_K8_RGB+XY.png # Segmentação RGB+XY (7 maçãs)
├── segmentacao_variableObjects_K5_RGB.png
├── segmentacao_variableObjects_K5_RGB+XY.png
├── segmentacao_2or4objects_K5_RGB.png
├── segmentacao_2or4objects_K5_RGB+XY.png
├── dispersao_3d_5clusters.png # Gráfico 3D (apenas 2or4objects.jpg)
├── deteccao_face1_thresholding.png # Thresholding (face 1)
├── deteccao_face1_seeded.png # Seeded (face 1)
├── deteccao_face2_thresholding.png
├── deteccao_face2_seeded.png
├── deteccao_face3_thresholding.png
├── deteccao_face3_seeded.png
├── deteccao_face4_thresholding.png
├── deteccao_face4_seeded.png
└── DISCUSSAO.txt # Análise e discussão
RGB vs RGB+XY:
-
RGB: Segmenta baseado apenas em cor
- Objetos da mesma cor são agrupados independente da posição
- Pode ter "sal e pimenta" (pixels isolados com cores diferentes)
-
RGB+XY: Segmenta baseado em cor + posição
- Objetos próximos espacialmente tendem a estar no mesmo cluster
- Resultados mais espacialmente coerentes (regiões contínuas)
- Melhor para objetos da mesma cor em posições diferentes
Gráfico 3D:
- Mostra distribuição dos pixels no espaço RGB
- Clusters bem separados indicam boa segmentação
- Sobreposição indica dificuldade de separar cores
Thresholding:
- Geralmente detecta mais áreas (inclui mãos, braços, etc.)
- Pode ter falsos positivos (objetos com cor similar à pele)
- Rápido e simples
Seeded Segmentation:
- Mais específico à região ao redor do seed
- Menos falsos positivos se seed está no rosto
- Depende da escolha do seed point
Vantagens:
- ✅ Simples e computacionalmente eficiente (3 dimensões)
- ✅ Boa para objetos com cores distintas
- ✅ Resultados próximos da segmentação por cor pura
- ✅ Interpretável (apenas cores)
Desvantagens:
- ❌ Não separa objetos da mesma cor em posições diferentes
- ❌ Pode agrupar objetos diferentes com cores similares
- ❌ Pode gerar segmentação "sal e pimenta" (pixels isolados)
- ❌ Não considera contexto espacial
Quando usar?
- Objetos com cores muito distintas
- Quando queremos segmentar apenas por cor
- Quando performance é crítica
Vantagens:
- ✅ Melhor para separar objetos da mesma cor em posições diferentes
- ✅ Resultados espacialmente coerentes (regiões contínuas)
- ✅ Reduz efeito "sal e pimenta"
- ✅ Melhor para objetos com cores similares mas fisicamente separados
Desvantagens:
- ❌ Pode agrupar objetos diferentes próximos espacialmente
- ❌ Computacionalmente mais caro (5 dimensões vs 3)
- ❌ Pode perder objetos pequenos próximos de objetos maiores
- ❌ Normalização das coordenadas é crítica
Quando usar?
- Objetos com cores similares mas separados espacialmente
- Quando queremos segmentação espacialmente coerente
- Quando objetos têm variabilidade de cor dentro da região
Conclusão:
- RGB: Melhor quando queremos segmentar puramente por cor
- RGB+XY: Melhor quando queremos coerência espacial e separar objetos da mesma cor
Sem ground truth (verdade absoluta), é difícil avaliar quantitativamente. Discutimos métricas comuns:
Definição:
IoU = |A ∩ B| / |A ∪ B|
- A = região segmentada
- B = ground truth
Varia de 0 a 1:
- 0: Sem sobreposição
- 1: Sobreposição perfeita
Uso:
- Padrão da indústria
- Fácil de calcular e interpretar
Limitação:
- Requer ground truth manual
Definição:
Dice = 2|A ∩ B| / (|A| + |B|)
Similar ao IoU, mas:
- Mais sensível à sobreposição
- Útil quando há desbalanceamento de classes
Definição:
Acc = (TP + TN) / (TP + TN + FP + FN)
Problemas:
- Pode ser enganoso se classes estão desbalanceadas
- Ex: Se 90% da imagem é fundo, 90% accuracy pode ser trivial
Hausdorff Distance:
- Mede máxima distância entre boundaries
- Útil para avaliar precisão de contornos
Boundary IoU:
- IoU calculado apenas nas bordas
- Importante para aplicações onde bordas são críticas
Adjusted Rand Index (ARI):
- Mede concordância entre segmentações
- Não requer ground truth absoluto (comparação entre métodos)
Variation of Information:
- Mede informação perdida/ganha entre segmentações
- Útil para comparação qualitativa
Mean IoU:
- Média de IoU sobre todas as classes
- Útil para segmentação multi-classe
Frequency Weighted IoU:
- Pondera IoU pela frequência das classes
- Evita bias para classes raras
Limitações Gerais:
- Todas as métricas quantitativas requerem ground truth
- Para avaliação sem ground truth, precisamos:
- Métricas de qualidade visual (coerência espacial, suavidade)
- Métricas de consistência interna
- Comparação qualitativa entre métodos
-
Espaço de Cores Importa:
- HSV é superior a RGB para detecção baseada em cor
- Escolha do espaço de cores depende da aplicação
-
Features Multidimensionais:
- Adicionar contexto espacial (XY) melhora coerência
- Normalização é crítica para balancear dimensões
-
Algoritmos Complementares:
- Thresholding: Rápido, geral
- Region Growing: Específico, controlável
- K-means: Não-supervisionado, flexível
-
Avaliação Qualitativa:
- Sem ground truth, avaliação é principalmente visual
- Comparação entre métodos fornece insights valiosos
- Segmentação K-means: Análise de imagens médicas, detecção de objetos, compressão
- Detecção de Pele: Sistemas de segurança, análise de gestos, realidade aumentada
- Region Growing: Segmentação médica, análise de texturas, isolamento de objetos
-
K-means:
- Seleção automática de K (elbow method, silhouette score)
- Inicialização inteligente (K-means++)
- Aplicação a vídeo (segmentação temporal)
-
Detecção de Rosto:
- Deep Learning para melhor precisão
- Multi-escala para faces de tamanhos diferentes
- Rastreamento em vídeo
-
Avaliação:
- Implementar métricas quantitativas
- Interface para marcação de ground truth
- Análise estatística de resultados
- NumPy: https://numpy.org/doc/
- OpenCV: https://docs.opencv.org/
- Matplotlib: https://matplotlib.org/stable/contents.html
- Scikit-learn: https://scikit-learn.org/stable/
- K-means Clustering: "Pattern Recognition and Machine Learning" - Bishop
- Region Growing: "Digital Image Processing" - Gonzalez & Woods
- Espaços de Cores: "Computer Vision: Algorithms and Applications" - Szeliski
Erro: "No module named 'cv2'"
- Solução: Instale opencv-python:
pip install opencv-python
Erro: "Permission denied" ao salvar resultados
- Solução: Verifique permissões do diretório
results/
Resultados ruins na segmentação
- Solução: Ajuste valores de K ou tolerância nos algoritmos
Imagens não carregam
- Solução: Verifique caminhos das imagens em
main.py
Este projeto foi desenvolvido para fins educacionais e acadêmicos.
Desenvolvido para: Processamento de Imagens - Felipe Viel Univali Data: 2025 Autor: Lucas Vieira e Rodrigo Spicker