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

Documentos relacionados