# Dinâmicas e Valores de Extinção

## Anotações

Date: 29/1/2008

# Height Dynamics

## Definições do livro Hands-on

• h-maxima

"The height of a level component is the number of level components above it in the stacking plus 1. The h-maxima filter removes all level components with height below h. A level component is a regional maximum if it has heigh 1."

Note que a implementação da toolbox não corresponde a essa definição: o componente é removido se a altura é menor ou igual ao parâmetro. A definição usada na toolbox é baseada na reconstrução:

"mmhmax inf-reconstructs the gray-scale image f from the marker created by the subtraction of the positive integer value h from f, using connectivity Bc. This operator removes connected peaks with contrast less than h."

• Valores de extinção e dinâmicas

"If is a connected operator with parameter that is decreasing in , then the extinction value of a regional maximum is the largest parameter of the connected filter that does not filter out the regional maximum, which means that after filtering, the regional maximum either remains as is or becomes a subset of a new regional maximum for all parameter values less than or equal to this maximum parameter."

"Dynamics provide a tool for selecting significant extrema with respect to a contrast criterion. The dynamic of a maximum is the height we have to climb down from the maximum to reach another maximum of higher altitude. The concept of extinction values generalizes the dynamics concept. The height extinction value of an extremum is the dynamic. There are eficient algorithms to compute the extinction values using the component tree data structure or union-find algorithms."

Na sequência, apresenta-se os máximos regionais calculados com a MaxTree, com a função mmregmin e de acordo com a definição acima.

``` 1 img = array([[  3,   3,   3,   5,   6,   2,   5,   4,  19,  43,  28],
2              [  3,   3,   3,   4,   1,   6,   2,   2,  22,  40,  24],
3              [  4,   4,   2,   1,   2,   1,   1,   1,  19,  43,  24],
4              [  4,   4,   2,   5,   4,   1,   3,   6,  20,  40,  29],
5              [  3,   4,   5,   5,   4,   5,   6,   5,  20,  42,  26],
6              [  4,   3,   3,   4,   8,  17,  26,  14,  17,  37,  25],
7              [  6,   4,   4,   8,  18,  19,  20,  26,  29,  40,  24],
8              [  4,   6,   8,  13,  19,  10,  10,  12,  30,  46,  24],
9              [ 49,  53,  54,  48,  60,  50,  44,  60,  51,  59,  51],
10              [210, 208, 204, 202, 216, 224, 222, 223, 214, 194, 177],
11              [176, 176, 177, 171, 184, 191, 184, 199, 194, 170, 161]], uint8)
12 im = mmneg(img)
13
14 mxt = maxtree(im)
15 rmin1 = maxregmax(mxt)
16
17 cb1 = chessboard_image(im, None, rmin1)
18 adshow(cb1, title='(a) Imagem original invertida')
19
20 hdyn1 = maxregmax(mxt, 'h-dyn-image')
21 hdyn2 = mmregmin(img, mmsecross(), 'dynamics')
22
23 cb2 = chessboard_image(hdyn1, rmin1, hdyn1)
24 cb3 = chessboard_image(hdyn2, rmin1, hdyn2)
25
26 adshow(cb2, title='(b) Calc por maxtree')
27 adshow(cb3, title='(c) Calc por regmin')
28
29 qq = img - img
30 rmax1 = rmin1
31 for i in range(im.max()+1):
32     a = maxaopen(mxt, 'height', i)
33     rmax = mmregmax(a)
34     qq = where(rmax & rmax1, i, qq)
35     rmax1 = rmax & rmax1
36
37 cb = chessboard_image(qq, rmin1, rmin1)
38 adshow(cb, title='(d) Implementacao direta da definicao')
```

## Evolução dos Máximos Regionais

As figuras seguintes mostram a evolução dos máximos regionais da imagem em sucessivas aberturas h-maxima com valores crescentes de h. As marcas centrais indicam os máximos regionais da imagem original sobreviventes.

``` 1 cc = '#5cacac'
2 dd = '#bcc5ca'
3 n = mmlabel(rmin1).max()
4 cb = chessboard_image(im, zeros(im.shape, bool), rmin1, rmin1, pix_size=15,
5                                                  fill_cell=dd, fill_cell2=cc)
6 adshow(cb, title='(a) H = 0: %d regional maxima.' % n)
7 xx = 'bcdefghijklmnopq'
8 zz = rmin1
9 j = 0
10 for i in range(im.max()+1):
11     a = maxaopen(mxt, 'height', i)
12     rmax = mmregmax(a)
13     b = mmlabel(rmax).max()
14     if b < n or rmax.min() == 1:
15         zz = zz & rmax
16         cb = chessboard_image(a, zeros(im.shape, bool), rmax, zz, pix_size=15,
17                                                         fill_cell=dd, fill_cell2=cc)
18         adshow(cb, title='(%s) H = %d: %d regional maxima.' % (xx[j], i, b))
19         n = b
20         j += 1
21         if rmax.min() == 1:
22             break
```

## Observações

• Máximo de maior dinâmica

É possível imaginar dois critérios:

• Supondo que o entorno da imagem é formado por pixels iguais a zero, o valor de extinção do maior máximo regional é igual ao pixel máximo da imagem. Fig. fighmax (d).
• Se considerarmos que uma imagem constante não apresenta pixels de menor intensidade e portanto não tem máximos regionais, o valor de extinção do maior máximo regional é aquele que gera uma imagem constante. Veja as figuras fighmax (b) e fighmaxseq. A implementação via maxtree considera esse caso.

Qual será a opção correta?

• Na implementação direta, Fig. fighmax (d), os valores de extinção estão com valores diminuídos de um (considera-se o valor anterior à extinção, como na definição).

• Os máximos regionais com valores iguais a 254, na fig. fighmax (a), se unem na fig. fighmaxseq (b) e mostram que a implementação do mmregmin contraria a definição acima (... becomes a subset...). O mesmo ocorre com os máximos iguais a 231.

• Na definição das dinâmicas a partir de valores de extinção não existe a noção de empate; vários máximos regionais podem ser extintos com um mesmo valor de .

# Area Dynamics

Aqui as dinâmicas calculadas com a maxtree estão coerentes com a definição. No caso do mmregmin, como esperado, existe um problema. É preciso, contudo, ver o problema da região de maior dinâmica.

``` 1 adyn1 = maxregmax(mxt, 'a-dyn-image')
2 adyn2 = mmregmin(img, mmsecross(), 'area-dyn')
3
4 cb4 = chessboard_image(adyn1, rmin1, adyn1)
5 cb5 = chessboard_image(adyn2, rmin1, adyn2)
6 adshow(cb4, title='(a) Calc por maxtree')
7 adshow(cb5, title='(b) Calc por regmin')
8
9 qq = img - img
10 rmax1 = rmin1
11 for i in range(121):
12     a = maxaopen(mxt, 'area', i)
13     rmax = mmregmax(a)
14     qq = where(rmax & rmax1, i, qq)
15     rmax1 = rmax & rmax1
16
17 cb = chessboard_image(qq, rmin1, rmin1)
18 adshow(cb, title='(c) Implementacao direta da definicao')
```