Resultados | Exercícios 6 | Jose Luis Cueva Mamani (jose_cueva)

activity_jose_cueva_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 
 6 def twsm(f,marker,Bc):
 7 
 8      TZ = 0;
 9      img = f.ravel();
10      m = marker.ravel();
11      mrkr = np.nonzero(m)[0];
12      sizeImg = img.size;
13 
14      N = ws.N(f.shape,ws.se2off(Bc));
15 
16      done = np.zeros(img.shape,dtype='bool')
17      C2 = np.zeros(img.shape,dtype='int32')
18      C1 = np.zeros(img.shape,dtype='int32')
19      P = np.zeros(img.shape,dtype='int32')
20      label = np.zeros(img.shape,dtype='int32')
21 
22      C1[:] = np.iinfo(np.int32).max
23      P[:]  = -2
24      label[:] = -2
25 
26      fila = ws.wsHeapQueue()
27 
28      for p in mrkr:
29          C1[p] = img[p]
30          label[p] = m[p]
31          P[p] = p
32          fila.push(p,img[p])
33      while not fila.empty():
34          v = fila.pop()
35          done[v] = True
36          for p in N[v]:
37              if( p < sizeImg):
38                  if (done[p] == False):
39                      c = max(C1[v],img[p])
40                      if(c < C1[p]):
41                          C1[p] = c
42                          label[p] = label[v]
43                          P[p] = v
44                          fila.push(p,C1[p])
45                          if( c == C1[v]):
46                              C2[p] = C2[v] + 1
47                      elif( c == C1[p]) and( label[p] != label[v]):
48 
49                          if(c == C1[v]):
50                               if( C2[p] == C2[v] + 1):
51                                   label[p] = TZ
52                          else:
53                               label[p] = TZ
54      return label.reshape(f.shape)

2. Testando as funções

1 from result_6_twsm import tester
2 import activity_jose_cueva_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,'jose_cueva')
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 jose_cueva twsm() 1.355 100% 952.331 100% 953.685 100%
[–] Comments
Roberto Lotufo at 2015-05-26 21:58h
 0
Olá José, fez de acordo com minhas orientações.