report - LCG
Transcrição
report - LCG
Implementação do artigo “Efficient Graph-Based Image Segmentation” Introdução ao Processamento de Imagens COS756 - PESC/COPPE/UFRJ 2011 Alejandra Klachquin PESC - COPPE, UFRJ [email protected] Resumo: Relatório do trabalho final da disciplina “Introdução ao Processamento de Imagens”. Tem como objetivo implementar o algoritmo de segmentação de imagens baseado em grafos, apresentado no artigo “Efficient Graph-Based Image Segmentation” [2]. Mais especificamente, é analisado o caso para Nearest Neighbor Graphs para imagens em RGB e HSV. 1 Introdução A segmentação de uma imagem é um processo que consiste em dividı́-la em múltiplas regiões, com o objetivo de simplificar e/ou modificar a sua representação a fim de facilitar a sua análise. Como exemplo, a segmentação de uma imagem pode ser utilizada como pré-processamento para identificar ou reconhecer objetos. Ao final do processo, pixels que pertencem ao um mesmo segmento terão determinadas caracterı́sticas visualmente semelhantes entre si (e.g. localização, cor, intensidade). Diversos mecanismos podem ser utilizados para segmentar uma imagem, como detecção de arestas, histograma e clusterização. Neste trabalho, iremos apresentar resumidamente e implementar uma técnica baseada em grafos para segmentação de imagens descrita em [2]. Nesse mecanismo a imagem é mapeada através de um grafo, cada nó representando um pixel e arestas entre pixels medirão o grau de dissimilaridade entre eles. Por ser uma técnica adaptativa, de acordo com o grau de dissimilaridade entre segmentos vizinhos, visı́veis caracterı́sticas globais da imagem poderão ser captadas. O restante deste trabalho está dividido da seguinte forma: na Seção 2 apresentamos a parametrização da imagem atraveś do grafo e o predicado para comparar se dois segmentos da imagem devem permanecer separados ou não. Na Seção 3 apresentamos o algoritmo e na Seção 4 alguns resultados. Finalmente na Seção 5, apresentamos as conclusões. 2 Segmentação baseada em grafo Seja G = (V, E) um grafo não-orientado com vértices v ∈ V , o conjunto de elementos a ser segmentado, e as arestas (vi , vj ) ∈ E os pares de vértices vizinhos. Cada aresta (vi , vj ) ∈ E possui um peso associado w(vi , vj ) não-negativo, que corresponde à medida de dissimilaridade entre os elementos vi e vj . Para segmentar a imagem, cada vértice irá corresponder a um pixel da imagem e o peso da aresta é uma medida de dissimilaridade entre os dois pixels conectados por essa aresta, que será descrita mais adiante. Uma segmentação S será uma partição de V em componentes tal que cada componente C ∈ S corresponde a uma componente conexa em um grafo G0 = (V, E 0 ), onde E 0 ⊆ E. Dessa forma, segmentações serão induzidas por um subconjunto de arestas em E. Na abordagem desta 1 segmentação, vamos querer que arestas entre vértices de uma mesma componentes tenham peso relativamente baixo (isto é, que os pixels correspondentes possuam baixa dissimilaridade) e arestas entre vértices de diferentes componentes possuam pesos maiores (isto é, maior dissimilaridade). 2.1 Vizinhos mais próximos Para definir quais serão as arestas (vi , vj ) ∈ E e seus respectivos pesos, iremos mapear cada pixel em um ponto 5-dimencional (x, y, r, g, b), onde (x, y) é a localização do pixel na figura e (r, g, b) são os valores das cores do pixel. Em uma segunda abordagem não trabalhada no artigo original, convertemos a imagem para a base RGB para HSV, e então realizamos o mesmo procedimento. Dados os pontos, calculamos a distância L2 (Euclidiana) para encontrar os p (neste trabalho, 8) vizinhos aproximadamente mais próximos. Para realizar a busca, utilizamos o algoritmo ANN [1]. Por ser aproximativo, alguns vértices poderão ter mais que p vizinhos ao final da construção do grafo (a busca pelos vizinhos não é simétrica, isto é, vi ser um dos vizinhos aproximadamente mais próximos de vj não implica no oposto). Ao utilizar uma abordagem onde vizinhos no grafo não necessariamente representam pixels vizinhos, poderemos capturar aspectos espaciais não-locais na imagem. Isto é, será possı́vel obter regiões que são desconexas na imagem original. 2.2 Predicado de Comparação Entre Componentes A seguir, apresentamos o predicado D que irá definir se existe evidência para uma fronteira entre duas componentes (ou segmentos) em uma dada segmentação. O predicado é baseado na dissimilaridade entre os elementos que estão na fronteira entre as componentes comparada com a medida de dissimilaridade entre elementos vizinhos em cada uma das componentes. Dessa forma, a comparação é adaptativa em relação às caracterı́sticas locais dos dados. Iremos definir como diferença interna de uma componente C ⊆ V o maior peso dentre as arestas que pertecem à árvore geradora mı́nima (MST) da componente, M ST (C, V ): Int(C) = max w(e) (1) e∈M ST (C,E) Já a diferença entre duas componentes componentes C1 , C2 ⊆ V é o menor peso dentre as arestas que conectam as duas componentes: Dif (C1 , C2 ) = min ci ∈C1 ,vj ∈C2 ,(vi ,vj )∈E w(vi , vj ) (2) Se não houver aresta conectando C1 e C2 , Dif (C1 , C2 ) = inf. O predicado de comparação D irá checar se a diferença entre as componentes Dif (C1 , C2 ) é grande em relação à diferença interna entre pelo menos uma das componentes, Int(C1 ) e Int(C2 ). Para controlar quão grande a diferença entre componentes deverá ser, será usada uma função de threshold τ (C) = k|C|, onde |C| é o tamanho de C e k é um parâmetro constante. Esse threshold é baseado no tamanho da componente pois Int(C) não é um bom estimador para componentes pequenas (no caso extremo |C| = 1, Int(C) = 0). Assim, definimos: true if Dif (C1 , C2 ) > M Int(C1 , C2 ) D(C1 , C2 ) = f alse otherwise Onde M Int(C1 , C2 ) = min(Int(C1 ) + τ (C1 ), Int(C2 ) + τ (C2 )). Dessa forma, podemos ver que, para componentes pequenas, é necessário uma envidência maior para a existência de uma fronteira. Além disso, através do parâmetro k podemos dar prefência a componentes maiores ou menores (valores maiores de k permitem a formação de maiores componentes). 3 Algoritmo A entrada do algoritmo é um grafo G = (V, E), com n vértices e m arestas. A saı́da é uma segmentação de V nas componentes S = (C1 , ..., Cr ). O grafo G é gerado como descrito na Seção 2, e para gerar a MST é utilizado o algortimo de PRIM. 3.1 Pseudo-código 1. Ordenar E em π = (o1 , ..., om ) em ordem crescente do peso das arestas. 2. Começar com a segmentação S 0 , onde cada vértice vi está em sua própria componente. 3. Repetir o passo 4 para q = 1, ..., m. 4. Construir S q dado S q−1 da seguinte forma. Seja vi e vj os vértices conectados pela qésima aresta na ordenação, i. e.,oq = (vi , vj ). Se vi e vj estão em componentes disjuntas de S q−1 e w(oq ) é pequeno comparado com a diferença interna de ambas componentes, então junte as duas componentes. Caso contrário, não faça nada. Mais formalmente, seja Ciq−1 a componente de S q−1 contendo vi e Cjq−1 a componente de S q−1 contendo vj . Se Ciq−1 6= Cjq−1 e w(oq ) ≤ M Int(Ciq−1 , Cjq−1 ), então S q é obtido a partir de S q−1 através da união de Ciq−1 e Cjq−1 ). Senão, S q = S q−1 . 5. Retorne S = S m . 4 Resultados Através das figuras a seguir, é fácil comprovar que um valor pequeno de k segmenta mais a imagem. Além disso, a abordagem que transforma a imagem original para a base HSV, para então definir as caracterı́sticas dos vértices e construir as arestas do grafo, mostrou, em determinados aspectos, um melhor desempenho. As Figuras 4 e 5 mostram um comparativo dos resultados obtidos a partir do algoritmo implementado neste trabalho e os obtidos no artigo original. Em ambos os casos existe uma diferença significativa. Uma possı́vel explicação para isso, é que as imagens utilizadas no algoritmo implementado para este trabalho possuem pelo menos metade do tamanho da original (o artigo original não especifica o tamanho real das duas imagens). Dessa forma, diversas caracterı́sticas importantes da imagem podem ter sido perdidas. Além disso, tampouco está descrito no artigo original o número de vizinhos utilizado na abordagem Nearest Neighbor Graphs, o que poderia gerar resultados distintos. 4.1 Dificuldades encontradas A maior dificuldade encontrada neste trabalho foi a quantidade de memória requisitada pela implementação realizada. Por esse motivo, apenas foi possı́vel trabalhar com imagens muito pequenas (da ordem de 100x100 pixels). Como exemplo, para a Figura 5, em uma máquina i5 com 4GB de memória, o programa utilizou aproximadamente 70% da capacidade da máquina, levando aproximadamente 2 minutos na CPU. Com pequenos ajustes, o tempo de execução pode ser facilmente reduzido, e novas estruturas de dados devem ser implementadas a fim de reduzir o consumo de memória e viabilizar o processamento em imagens maiores. 5 Conclusão Apesar das adversidades, o algoritmo implementado encontrou segmentações razoáveis para valores altos de k (acima de 300) nas figuras testadas (com poucos pixels). Além disso, a (a) Original (b) RGB, k=50 (c) RGB, k=500 (d) HSV, k=500 Figura 1: Tamanho real das imagens: 90x58 pixels (a) Original (b) RGB, k=50 (c) RGB, k=500 (d) HSV, k=500 Figura 2: Tamanho real das imagens: 85x85 pixels (a) Original (b) RGB, k=50 (c) RGB, k=500 Figura 3: Tamanho real das imagens: 75x100 pixels (d) HSV, k=500 (a) Artigo original (c) Trabalho original (b) Artigo, RGB, k=300 (d) Trabalho RGB, k=300 (e) Trabalho RGB, k=800 Figura 4: Tamanho real da imagem (c): 85x128 pixels abordagem HSV pareceu encontrar melhores resultados em relação ao RGB, tópico que não foi abordado no artigo original [2]. Dessa forma, como trabalho futuro é interessante investigar novas caracterı́sticas a serem utilizadas para escolher os vizinhos (em outras bases/representações, diferentes de localização, RGB ou HSV) e diferentes métricas para designar os pesos das arestas. Referências [1] Arya, S. and Mount, D.M. 1993. “Approximate nearest neighbor searching”. In Proc. 4th Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 271–280. [2] Pedro F. Felzenszwalb and Daniel P. Huttenlocher. 2004. “AEfficient Graph-Based Image Segmentation”. Int. J. Comput. Vision 59, 2 (September 2004), 167-181. (a) Artigo original (c) Trabalho original (b) Artigo, RGB, k=300 (d) Trabalho RGB, k=300 (e) Trabalho RGB, k=800 Figura 5: Tamanho real da imagem (c): 85x128 pixels