Resultados | Exercícios 6 | Guilherme Saraiva (guilhermesaraiva)

activity_guilhermesaraiva_6_twsm - Tie-zone Watershed from labeled markers

1. Definição da função a ser feita e testada

Implementar a transformada tie-zone watershed por marcadores rotulados similar à ia870:iatz, porém com a opção onde os marcadores já entram rotulados e o resultado é uma imagem rotulada e não as linhas do watershed.

O objetivo desta implementação é dar uma experiência sobre a implementação do watershed. A parte fundamental é a fila hierárquica e o desempenho do algoritmo é diretamente relacionada à eficiência desta fila hierárquica.

Sinta-se à vontade para fazer as otimizações que achar conveniente.

 1 def twsm(f,m,Bc):
 2 
 3     import numpy as np
 4     import courseIA8981S2015.aula11_ws as ws
 5 
 6     H, W = f.shape
 7     g = f.ravel()
 8 
 9     # Indexação dos pixels e seus vizinhos
10     Nlut = ws.N(f.shape,ws.se2off(Bc))
11 
12     # Inicializa flags
13     flag = np.ones(H*W, dtype=bool) # true: 'TEMP', false: 'DONE'
14 
15     # Inicializa os vetores de custo do trajeto para todos os pixels
16     C1 = np.empty(H*W, dtype=int)
17     C1[:] = 255
18     C2 = np.zeros(H*W, dtype=int)
19 
20 
21     # Cria a fila hierárquica
22     hq = ws.wsHeapQueue()
23 
24     # Inicializa vetor de saída
25     L = m.copy().ravel()
26 
27     # Define como sendo 0 o custo dos pixels inicialmente marcados
28     pp = np.flatnonzero(m)
29     for p in pp:
30         C1[p] = g[p]
31         hq.push(p,g[p])
32 
33     # Propagação
34     while not hq.empty():
35         v = hq.pop()
36         flag[v] = False
37         for p in Nlut[v]:
38             if p < f.size and flag[p]:
39                 temp = max(C1[v],g[p])
40                 if temp < C1[p]:
41                     L[p] = L[v]
42                     C1[p] = temp
43                     hq.push(p,C1[p])
44                     if temp == C1[v]:
45                         C2[p] = C2[v] + 1
46                 elif temp == C1[p] and L[p] != L[v]:
47                     if temp == C1[v]:
48                         if C2[p] == C2[v] + 1:
49                             L[p] = 0
50                     else:
51                         L[p] = 0
52 
53     return L.reshape((H,W))

2. Testando as funções

1 from result_6_twsm import tester
2 import activity_guilhermesaraiva_6_twsm as my

Testes numéricos, 1 casos:

 1 for i in range(1):
 2 
 3     f,m,Bc = tester.get_input(i)
 4     k1 = tester.get_output(i)
 5 
 6     print
 7     print 'Caso ', i
 8     print
 9     print 'f=\n', f * 1
10     print 'm=\n', m
11     print 'Bc=\n', Bc * 1
12     print 'Resultado esperado =\n', k1
13     g1 = my.twsm(f,m,Bc)
14     print 'Meu resultado =\n', g1
Caso  0

f=
[[10 10 10 10 10 10 10]
 [10  9  6 18  6  5 10]
 [10  9  6 18  6  8 10]
 [10  9  9 15  9  9 10]
 [10  9  9 15 12 10 10]
 [10 10 10  8 10 10 10]]
m=
[[0 0 0 0 0 0 0]
 [0 0 1 0 0 2 0]
 [0 0 1 0 0 0 0]
 [0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0]
 [0 0 0 3 0 0 0]]
Bc=
[[0 1 0]
 [1 0 1]
 [0 1 0]]
Resultado esperado =
[[1 1 1 0 2 2 2]
 [1 1 1 0 2 2 2]
 [1 1 1 0 2 2 2]
 [1 1 1 0 2 2 2]
 [1 1 1 0 0 2 2]
 [1 1 0 3 3 0 0]]
Meu resultado =
[[1 1 1 0 2 2 2]
 [1 1 1 0 2 2 2]
 [1 1 1 0 2 2 2]
 [1 1 1 0 2 2 2]
 [1 1 1 0 0 2 2]
 [1 1 0 3 3 0 0]]

Testes com imagens, 1 caso:

 1 import numpy as np
 2 import ia636,ia870
 3 for i in range(1,2):
 4     print
 5     print 'Caso', i
 6     print
 7     f,m,Bc = tester.get_input(i)
 8     adshow(f, 'f.shape=%s caso %d' % (f.shape, i) )
 9     adshow(ia870.iaglblshow(m), 'marcador rotulado' )
10     print 'Bc=\n',Bc * 1
11     k1 = tester.get_output(i)
12     adshow(ia870.iaglblshow(k1), 'esperado, k1.shape=%s caso %d' % (k1.shape,i,) )
13     kmy1 = my.twsm(f,m,Bc)
14     adshow(ia870.iaglblshow(kmy1), 'meu, kmy1.shape=%s caso %d' % (kmy1.shape,i,) )
Caso 1

Bc=
[[1 1 1]
 [1 0 1]
 [1 1 1]]

f.shape=(128, 128) caso 1

marcador rotulado

esperado, k1.shape=(128, 128) caso 1

meu, kmy1.shape=(128, 128) caso 1

3. Colocando a função no sistema de testes do Adessowiki

Uma vez feita a função que você considera que esta funcionando, este trecho abaixo irá registrá-lo no teste automático, aparecendo na página resultados.

1 # Na linha abaixo, adiciona-se a função a ser testado. Caso queira registrar mais de uma
2 # função, é só adicionar mais uma linha com o run_test:
3 tester.run_test(my.twsm,'guilhermesaraiva')
4 tester.show_results_table()
Tabela de resultados consolidados de 0 funções distribuídas em 0 páginas distintas.
Ranking do autor Ranking da função Autor Função num 1 (tempo em ms) num 1 (pontuação) img 1 (tempo em ms) img 1 (pontuação) Tempo total (ms) Pontuação total
1 1 guilhermesaraiva twsm() 2.209 100% 711.350 100% 713.559 100%
[–] Comments
Roberto Lotufo at 2015-05-26 22:14h
 0
Olá Guilherme, no tie-zone ws, o custo é dado pelo maximo no caminho mas existe um segundo componente que é para explicitar o comportamente da FIFO utilizado na fila hierárquica, que é um critério adicional de distância quando os valores são todos constantes, conforme descrito no artigo do tie-zone. Só está faltando incluir este componente no custo.