daniel_chiu_Ex5

Autor: daniel_chiu
Data: 13/04/2009

Item 1

Serão realizados alguns testes da função iaapplylut, utilizando os exemplos que estão nos comentários do corpo da função e outros com as transformações de intensidade apresentadas em aula.

01. # Aplicando a função iaapplylut, utilizando transformações identidade e negativa"
02. f = [[0,1,2], [3,4,5]]
03. it = numpy.array(range(6)) # transformação identidade
04. print 'Array de transformação identidade\n'
05. print it
06. g = iaapplylut(f, it)
07. print 'Transformação identidade\n'
08. print g
09. itn = 5 - it  # negação
10. print '\n'
11. print 'Array de transformação negativa\n'
12. print itn
13. g = iaapplylut(f, itn)
14. print 'Transformação negativa\n'
15. print g
Array de transformação identidade

[0 1 2 3 4 5]
Transformação identidade

[[0 1 2]
 [3 4 5]]


Array de transformação negativa

[5 4 3 2 1 0]
Transformação negativa

[[5 4 3]
 [2 1 0]]
1. # Transformando a imagem em negativo
2. f = iaread('cameraman.pgm')
3. it = 255 - numpy.arange(256)
4. g = iaapplylut(f, it)
5. adshow(f, title="Imagem original")
6. adshow(g, title="Negativo da imagem")

Imagem original

Negativo da imagem

1. # Aplicando a função iaapplylut em uma transformação com três camadas
2. A = array([[0,1,1],[0,0,1]])
3. T = array([[255,0,0], [0,255,0]])
4. B = iaapplylut(A,T)
5. 
6. print '\nTransformação em três camadas\n'
7. print B
Transformação em três camadas

[[[255   0   0]
  [255 255   0]]

 [[  0 255 255]
  [  0   0 255]]

 [[  0   0   0]
  [  0   0   0]]]
1. # Mostrando apenas o componente vermelho da imagem
2. f = iaread('cameraman.pgm')
3. aux = numpy.resize(range(256), (256,1))
4. ct = numpy.concatenate((aux, numpy.zeros((256,2))), 1)
5. g = iaapplylut(f, ct)
6. adshow(f, title="Imagem original")
7. adshow(g, title="Componente vermelho da imagem")

Imagem original

Componente vermelho da imagem

01. # As transformações abaixo são da forma s = T(r) = c * f(r).
02. 
03. # Transformações logarítmicas
04. # f(r) = 50 log(1+r)
05. it_log = 50*log(1+arange(256))
06. it_log = it_log.astype(int32)
07. 
08. # Transformação quadrática
09. # f(r) = r^2
10. it_quadratic = arange(256)**2
11. it_quadratic = it_quadratic.astype(int32)
12. it_quadratic[it_quadratic>255]=255
13. 
14. # Transformação em raiz quadrada
15. # f(r) = r^(1/2)
16. it_sqrt = sqrt(arange(256))
17. it_sqrt = it_sqrt.astype(int32)
18. 
19. # Transformação cúbica
20. # f(r) = r^3
21. it_cubic = arange(256)**3
22. it_cubic = it_cubic.astype(int32)
23. it_cubic[it_cubic>255]=255
24. 
25. adshow(iaapplylut(f,it_log), title = 's = 50 log(1+r)')
26. adshow(iaapplylut(f,it_quadratic), title = 's = r^2')
27. adshow(iaapplylut(f,it_sqrt), title = 's = r^(1/2)')
28. adshow(iaapplylut(f,it_cubic), title = 's = r^3')

s = 50 log(1+r)

s = r^2

s = r^(1/2)

s = r^3

Item 2

A seguir, será apresentado uma simplificação da função iaapplylut, baseada nas equações abaixo:

01. def dwsc_applylut(fi, it):
02. 
03.     fi=asarray(fi)
04.     it=asarray(it)
05. 
06.     if len(it.shape)==1: # para transformações em escala de cinza
07.         g = it[fi]
08.     elif it.shape[1]==3: # para transformações nas três camadas de cores (R,G,B)
09.         g = array([it[fi,0],it[fi,1],it[fi,2]])
10.     else: # apenas se aceita o array it com 1 ou 3 camadas
11.         g = array([])
12. 
13.     return g
01. # Aplicando a função dwsc_applylut, utilizando transformações identidade e negativa"
02. f = [[0,1,2], [3,4,5]]
03. it = numpy.array(range(6)) # transformação identidade
04. print 'Array de transformação identidade\n'
05. print it
06. g = dwsc_applylut(f, it)
07. print 'Transformação identidade\n'
08. print g
09. itn = 5 - it  # negação
10. print '\n'
11. print 'Array de transformação negativa\n'
12. print itn
13. g = dwsc_applylut(f, itn)
14. print 'Transformação negativa\n'
15. print g
Array de transformação identidade

[0 1 2 3 4 5]
Transformação identidade

[[0 1 2]
 [3 4 5]]


Array de transformação negativa

[5 4 3 2 1 0]
Transformação negativa

[[5 4 3]
 [2 1 0]]
1. # Transformando a imagem em negativo
2. f = iaread('cameraman.pgm')
3. it = 255 - numpy.arange(256)
4. g = dwsc_applylut(f, it)
5. adshow(f, title="Imagem original")
6. adshow(g, title="Negativo da imagem")

Imagem original

Negativo da imagem

1. # Aplicando a função dwsc_applylut em uma transformação com três camadas
2. A = array([[0,1,1],[0,0,1]])
3. T = array([[255,0,0], [0,255,0]])
4. B = dwsc_applylut(A,T)
5. 
6. print '\nTransformação em três camadas\n'
7. print B
Transformação em três camadas

[[[255   0   0]
  [255 255   0]]

 [[  0 255 255]
  [  0   0 255]]

 [[  0   0   0]
  [  0   0   0]]]
1. # Mostrando apenas o componente vermelho da imagem
2. f = iaread('cameraman.pgm')
3. aux = numpy.resize(range(256), (256,1))
4. ct = numpy.concatenate((aux, numpy.zeros((256,2))), 1)
5. g = dwsc_applylut(f, ct)
6. adshow(f, title="Imagem original")
7. adshow(g, title="Componente vermelho da imagem")

Imagem original

Componente vermelho da imagem

01. # As transformações abaixo são da forma s = T(r) = c * f(r).
02. 
03. # Transformações logarítmicas
04. # f(r) = 50 log(1+r)
05. it_log = 50*log(1+arange(256))
06. it_log = it_log.astype(int32)
07. 
08. # Transformação quadrática
09. # f(r) = r^2
10. it_quadratic = arange(256)**2
11. it_quadratic = it_quadratic.astype(int32)
12. it_quadratic[it_quadratic>255]=255
13. 
14. # Transformação em raiz quadrada
15. # f(r) = r^(1/2)
16. it_sqrt = sqrt(arange(256))
17. it_sqrt = it_sqrt.astype(int32)
18. 
19. # Transformação cúbica
20. # f(r) = r^3
21. it_cubic = arange(256)**3
22. it_cubic = it_cubic.astype(int32)
23. it_cubic[it_cubic>255]=255
24. 
25. adshow(dwsc_applylut(f,it_log), title = 's = 50 log(1+r)')
26. adshow(dwsc_applylut(f,it_quadratic), title = 's = r^2')
27. adshow(dwsc_applylut(f,it_sqrt), title = 's = r^(1/2)')
28. adshow(dwsc_applylut(f,it_cubic), title = 's = r^3')

s = 50 log(1+r)

s = r^2

s = r^(1/2)

s = r^3

Item 3

Abaixo, será implementada a função de ajuste linear por partes de contraste. Dados os valores de li, wi, lo e wo, a função retorna um array de transformação de contraste.

Semdo r o valor que representa a intensidade de entrada e s, a intensidade de saída, a equação para a curva de intensidade é:

Onde:

01. def pwlinear_contrast(li,wi,lo,wo):
02. 
03.     if li>255 or wi >255 or lo>255 or wo>255 or li<0 or wi<0 or lo<0 or wo<0:
04.         iaerror('Erro: entrar com um valor entre 0 e 255, por favor')
05.         return array([])
06. 
07.     # Forçando que os parâmetros de entrada sejam float
08.     li=li*1.0
09.     wi=wi*1.0
10.     lo=lo*1.0
11.     wo=wo*1.0
12. 
13.     # (r1,s1) e (r2,s2) são os pontos de inflexão da curva
14.     r1,s1=li-wi/2,lo-wo/2
15.     r2,s2=li+wi/2,lo+wo/2
16. 
17.     R=arange(256)
18. 
19.     # segmento S1: de (0,0) a (r1,s1)
20.     if r1==0:
21.         S1 = zeros(256) # se r1 for igual a 0, este segmento não contribui para S
22.     else:
23.         S1=s1/r1*R
24.         aux1= (R>r1)
25.         S1[aux1]=0
26. 
27.     # segmento S2: de (r1,s1) a (r2,s2)
28.     if r2==r1:
29.         S2 = zeros(256) # se r1 for igual a r2, este segmento não contribui para S
30.     else:
31.         S2=(s2-s1)/(r2-r1)*(R-r1)+s1
32.         aux2= (R<=r1) | (R>r2)
33.         S2[aux2]=0
34. 
35.     # segmento S3: de (r2,s2) a (255,255)
36.     if r2==255:
37.         S3 = zeros(256) # se r2 for igual a 255, este segmento não contribui para S
38.     else:
39.         S3=(255-s2)/(255-r2)*(R-r2)+s2
40.         aux3= (R<=r2)
41.         S3[aux3]=0
42. 
43.     # soma-se os três segmentos para obter a curva
44.     S = (S1+S2+S3).astype(int32)
45. 
46.     # trunca-se os valores abaixo de zero para zero e acima de 255 para 255.
47.     aux_min = (S<0)
48.     S[aux_min]=0
49.     aux_max = (S>255)
50.     S[aux_max]=255
51. 
52.     return S

Nesta implementação, os valores de li, wi, lo e wo podem ser alterados nesta página, observando a mudança no contraste e observando o gráfico de intensidade. Clique em "Change parameters" para mudar estes valores.

Imagem original

Contraste ajustado li=20,wi=20,lo=127,wo=255

Imagem original

Contraste ajustado li=20,wi=20,lo=127,wo=255

Imagem original

Contraste ajustado li=20,wi=20,lo=127,wo=255