giovani_ex5

Mapeamento de contraste ou de intensidade

  1. Estudar a função iaapplylut, fazendo alguns exemplos.
1 f = iaread('cameraman.pgm')
2 it = 255 - arange(256)
3 it[it.size/2:it.size] = 128 + arange(it.size/2)
4 g = uint16(iaapplylut(f, it))
5 iashow(f, title='Imagem original')
6 iashow(g, title='Imagem transformada pela função')
7 mmplot([[it]],['set yrange [0:256]','set xrange [0:256]'], ptitle='Funcao de intensidade aplicada')
ERROR execute

------------------------------------------------------------
*** Exception while evaluating code:
  File "<string>", line 4, in <module>
NameError: name 'iaapplylut' is not defined

------------------------------------------------------------

  1. Reprogramar a função iaapplylut para que ela seja mais simples. Se possível.
 1 # -----------------------------------------------------------------------
 2 def iaapplylut_1(f,it):
 3     resultado = it[f]
 4 
 5     return resultado
 6 # -----------------------------------------------------------------------
 7 
 8 it = 255 - arange(256)
 9 it[it.size/2:it.size] = 128 + arange(it.size/2)
10 g = uint16(iaapplylut_1(f, it))
11 iashow(f, title='Imagem original')
12 iashow(g, title='Imagem transformada pela função')
13 mmplot([[it]],['set yrange [0:256]','set xrange [0:256]'], ptitle='Funcao de intensidade aplicada')

Imagem original

Imagem transformada pela função

3. Implementar uma função interativa de melhoria de contraste da imagem. Deve-se usar a função monotonicamente crescente de intensidade formada por 3 segmentos de retas. Os dois pontos de inflexão destas retas devem ser calculados em função de 4 parâmetros: Wi,Li largura e intensidade média de entrada, e Wo, Lo, largura e intensidade média de saída. Existem algumas situações que vocês precisam prever o comportamento desta operação dependendo dos parâmetros passados. Utilizar algumas imagens para ilustrar o uso desta função interativa. Uma ilustração desta função, porém apenas com os parâmetros Wi e Li podem ser vistas em http://www.dca.fee.unicamp.br/DIPcourse/html-dip/c4/s3/front-page.html

Obs> falta definir os limites para os parametros passados....

 1 # -----------------------------------------------------------------------
 2 # Esta função recebe a imagem monocromática "f" e os parametros da função
 3 # "pin" = [wi,li] e "pout" = [wo,lo] e retorna a função "g" transformada
 4 # pelo contraste juntamente com as 3 semi-retas "sretas".
 5 # -----------------------------------------------------------------------
 6 def gicontrast (f,pin,pout):
 7 
 8     # pontos das semi-retas
 9     a = array([0,0])
10     b = array([pin[1]-(pin[0]/2.),pout[1]-(pout[0]/2.)])
11     c = array([pin[1]+(pin[0]/2.),pout[1]+(pout[0]/2.)])
12     d = array([f.max()+1,f.max()])
13 
14     sreta = zeros([3,2]) # Armazenar os coeficientes angular e linear das semi-reta [a,b]
15 
16     # semi-reta 1: ab
17     sreta[0,0] = (b[1]-a[1])/(b[0]-a[0])
18     sreta[0,1] = a[1]-(a[0]*sreta[0,0])
19 
20     # semi-reta 2: bc
21     sreta[1,0] = (c[1]-b[1])/(c[0]-b[0])
22     sreta[1,1] = b[1]-(b[0]*sreta[1,0])
23 
24     # semi-reta 3: cd
25     sreta[2,0] = (d[1]-c[1])/(d[0]-c[0])
26     sreta[2,1] = c[1]-(c[0]*sreta[2,0])
27 
28     vet = ravel(f)
29 
30     # Esta função devolve o vetor referente a respectiva faixa de dados que é determinada.
31     posin0,id0 = girange(vet,a[0],b[0])
32     posin1,id1 = girange(vet,b[0],c[0])
33     posin2,id2 = girange(vet,c[0],d[0])
34 
35     b0 = zeros(vet.size)
36     b1 = zeros(vet.size)
37     b2 = zeros(vet.size)
38 
39     # preencher as celulas em função da soma de cada reta.
40     # (para evitar erro quando fizer out = in * a + b )
41     b0[id0[0]] = sreta[0,1]
42     b1[id1[0]] = sreta[1,1]
43     b2[id2[0]] = sreta[2,1]
44 
45     # faz a transformação em relação a função definida.
46     posout0 = around(posin0 * sreta[0,0] + b0)
47     posout1 = around(posin1 * sreta[1,0] + b1)
48     posout2 = around(posin2 * sreta[2,0] + b2)
49 
50     agrupa = posout0 + posout1 + posout2
51     g = resize(agrupa,(f.shape[0],f.shape[1]))
52 
53     return g.astype(uint16),sreta
54 # -----------------------------------------------------------------------
  • Abordaremos um caso didático para entendimento:
img: 
[[ 50  52  58  60  62  20]
 [ 30  32  40  50  67  30]
 [ 31  31  43  48  70 190]
 [ 25  27  29  30  40 180]
 [ 23  22  20  18  25 100]]

 Parametros 
	 wi:20 li:50  
	 wo:30 lo:100

 g: 
[[100 103 112 115 116  42]
 [ 64  68  85 100 119  64]
 [ 66  66  90  97 121 189]
 [ 53  57  62  64  85 184]
 [ 49  47  42  38  53 138]]

  • Exemplo 1 com a imagem "cameraman":
Parametros 
	 wi:20 li:30  
	 wo:100 lo:100

Imagem original

Imagem Transformada

  • Exemplo 2 com a imagem "gull":
Parametros 
	 wi:100 li:100  
	 wo:50 lo:130

Imagem original

Imagem Transformada