Resultados | Exercícios 6 | Joao Marcos (joaomarcos)

activity_joaomarcos_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(im, cm,  Bc=MT.iasecross()):
12 
13     #Código original do ia870:iatz, modificado para utilizar os marcadores já rotulados
14 
15     offsets = MT.iase2off(Bc)
16 
17     # initialise variables
18     ws = wsImage(im)
19     N, im, lab, D = ws.begin(offsets)
20 
21     #------- Código Removido da implementação do ia870:iatz ------
22     # find minima
23     # M = findMinima(im, N, D)
24     #-------------------------------------------------------------
25 
26     #--- Código Adicionado: Adaptação feita pelo Francisco Leite (Em outra matéria, ia870) ---
27     #-----------------------------------------------------------------------------------------
28     wsM = wsImage(cm)
29     imM = wsM.begin(offsets)[1]
30 
31     Mset = dict()
32     for p in D:
33        if imM[p] > 0:
34           if Mset.has_key(imM[p]):
35              Mset[imM[p]].append(p)
36           else:
37              Mset[imM[p]] = [p]
38     M = Mset.values()
39     #------ Fim do Código Adicionado ---------------------------------------------------------
40 
41     # create the working images
42     done = ws.makeWorkCopy(False)
43     c1 = ws.makeWorkCopy(np.inf)
44     c2 = ws.makeWorkCopy(0)
45     par = ws.makeWorkCopy(MASK)
46     lab[:] = MASK
47 
48     queue = wsHeapQueue()
49 
50     for m in xrange(len(M)):
51         for p in M[m]:
52             c1[p] = im[p]
53             lab[p] = m+1
54             par[p] = p
55             queue.push(p, im[p])
56 
57     while not queue.empty():
58         p = queue.pop()
59         done[p] = True
60         for q in N(p):
61             if done[q]:
62                 continue
63 
64             c = max(c1[p], im[q])
65             if c < c1[q]:
66                 if c1[q] < np.inf:
67                     if queue.contains(q, c1[q]):
68                         queue.remove(q, c1[q])
69                 c1[q] = c
70                 lab[q] = lab[p]
71                 par[q] = p
72                 queue.push(q, c1[q])
73                 if c == c1[p]:
74                     c2[q] = c2[p] + 1
75             elif c == c1[q] and lab[q] != lab[p]:
76                 if c == c1[p]:
77                     if c2[q] == c2[p] + 1:
78                         lab[q] = TIE_ZONE
79                 else:
80                     lab[q] = TIE_ZONE
81 
82     return ws.end()

2. Testando as funções

1 from result_6_twsm import tester
2 import activity_joaomarcos_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,'joaomarcos')
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 joaomarcos twsm() 1.405 100% 290.727 100% 292.132 100%
[–] Comments
Joao Marcos at 2015-05-26 22:40h
 0
Obrigado professor.

Roberto Lotufo at 2015-05-26 21:49h
Likes:
Joao Marcos
 1
Olá João, eu comentei a importação do aula11_ws pois você está usando a estrutura pdp_common feita pelo André Korbes no seu mestrado.