Segmentação de imagem

Uma etapa importante no processamento de imagens digitais para analisar o que está dentro dela é classificar seu conteúdo de pixeis em diferentes grupos. Esse processo é chamado de segmentação de imagem, cujo objetivo é transformar a representação de uma imagem em algo mais significativo e fácil de analisar. É muito comum o uso de algoritmos de agrupamento (“clusters”) para realizar esse procedimento. O post sobre Análise de clusters faz uma breve revisão dos métodos hierárquico e não-hierárquico de agrupamento, com aplicações em python.

Imagem all sky original e segmentada em 3 cores
Imagem all sky original e segmentada em 3 cores

O OpenCV (Open Source Computer Vision Library), originalmente desenvolvido e lançado pela Intel em 1999, é uma biblioteca livre e multiplataforma para o desenvolvimento de aplicativos na área de visão computacional. Desenvolvida em C/C++, pode ser usada no python instalando-se a biblioteca “opencv” (disponível no Conda). Possui módulos de processamento de imagens e centenas de algoritmos, como filtros de imagem, calibração de câmera, reconhecimento de objetos, análise estrutural e outros.

Além de carregar a imagem, é necessário converter do RGB Colors Space para HSV. Isso porque os componentes R, G e B da cor de um objeto em uma imagem digital estão todos correlacionados com a quantidade de luz que atinge o objeto e, portanto, as descrições de imagens entre si em termos desses componentes dificultam a discriminação de objetos. Descrições em termos de matiz, luminosidade, e saturação são frequentemente mais relevantes.

O OpenCV fornece a função cv2.kmeans(amostras, nclusters(K), critérios, numero_tentativas, sinalizadores) para agrupamento de cores. Os critérios são definidos como tipo, número máximo de iterações e epsilon (precisão). Os tipos podem ser cv.TERM_CRITERIA_EPS (interrompe a iteração do algoritmo se a precisão especificada, epsilon, for atingida), cv.TERM_CRITERIA_MAX_ITER (interrompe o algoritmo após o número especificado de iterações, max_iter) ou as duas juntas (interrompe a iteração quando alguma das condições for atendida). Os sinalizadores podem ser cv.KMEANS_PP_CENTERS ou cv.KMEANS_RANDOM_CENTERS.

Veja o exemplo a seguir:

Foi escolhido k = 3 para considerar os agrupamentos com as cores preta das bordas, azul do céu e branco/cinza das nuvens. Também foram incluídos blocos (comentados) para remover limiares de cores e para detecção de bordas. Fonte: KDnuggets – Introduction to Image Segmentation with K-Means clustering.