Resultados | Exercícios 6 | Lucas Franz (lfranz)

activity_lfranz_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 import numpy as np
 2 import ia636 as ia
 3 import ia870 as MT
 4 #import aula11_ws as ws
 5 from ipdp.common import wsImage, wsHeapQueue
 6 
 7 # constants
 8 MASK = -2
 9 TIE_ZONE = 0
10 
11 def twsm(f,m,Bc=MT.iasecross()):
12     offsets = MT.iase2off(Bc)
13 
14     ws = wsImage(f)
15     N, f, lab, D = ws.begin(offsets)
16 
17     wsM = wsImage(m)
18     imM = wsM.begin(offsets)[1]
19 
20     Mset = dict()
21     for p in D:
22        if imM[p] > 0:
23           if Mset.has_key(imM[p]):
24              Mset[imM[p]].append(p)
25           else:
26              Mset[imM[p]] = [p]
27     M = Mset.values()
28 
29     done = ws.makeWorkCopy(False)
30     c1 = ws.makeWorkCopy(np.inf)
31     c2 = ws.makeWorkCopy(0)
32     par = ws.makeWorkCopy(MASK)
33     lab[:] = MASK
34 
35     queue = wsHeapQueue()
36 
37     for a in xrange(len(M)):
38         for p in M[a]:
39             c1[p] = f[p]
40             lab[p] = a+1
41             par[p] = p
42             queue.push(p, f[p])
43 
44     while not queue.empty():
45         p = queue.pop()
46         done[p] = True
47         for q in N(p):
48             if done[q]:
49                 continue
50 
51             c = max(c1[p], f[q])
52             if c < c1[q]:
53                 if c1[q] < np.inf:
54                     if queue.contains(q, c1[q]):
55                         queue.remove(q, c1[q])
56                 c1[q] = c
57                 lab[q] = lab[p]
58                 par[q] = p
59                 queue.push(q, c1[q])
60                 if c == c1[p]:
61                     c2[q] = c2[p] + 1
62             elif c == c1[q] and lab[q] != lab[p]:
63                 if c == c1[p]:
64                     if c2[q] == c2[p] + 1:
65                         lab[q] = TIE_ZONE
66                 else:
67                     lab[q] = TIE_ZONE
68 
69     return ws.end()

2. Testando as funções

1 from result_6_twsm import tester
2 import activity_lfranz_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,'lfranz')
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 lfranz twsm() 1.427 100% 473.505 100% 474.932 100%
[–] Comments
Roberto Lotufo at 2015-05-26 21:50h
 0
Olá Lucas, comentei a importação de aula11_ws pois você não a está utilizando. Você está utilizando a pdp_common.

Eduardo Schneider at 2015-05-26 21:25h
 0
Lucas, utilizei a sua solução. Obrigado, Eduardo.