lionisEX05

Autor: lionis
Data: 06/04/2009
  1. Estudar a função iaapplylut, fazendo alguns exemplos.

Foram realizados alguns exemplos no item 2, comparando os resultados com a iaapplylut otimizada.

  1. Reprogramar a função iaapplylut para que ela seja mais simples. Se possível.
 1 from ia636 import iaapplylut
 2 
 3 def iaapplylutEnhanced(f, it):
 4     I = it[f]
 5     I *= 256 / I.max()
 6     return I #os tons de cinza da imagem 'f' são os índices do array 'it', que por sua vez levam aos novos tons de cinza, formando a nova imagem
 7 
 8 f = mmreadgray('boat.tif')
 9 
10 it = 255 - arange(256) #forma o array it[i]=j, onde: it[0]=255, it[1]=254..., it[255]=0. Assim, o tom 'i' será substituído pelo tom 'j'
11 adshow(iaapplylut(f, it), title = 'iaapply original: função negativa')
12 adshow(iaapplylutEnhanced(f, it), title = 'iaapply enhanced: função negativa')
13 
14 it = log(arange(256)+1)
15 adshow(iaapplylut(f, it), title = 'iaapply original: função logarítmica')
16 adshow(iaapplylutEnhanced(f, it), title = 'iaapply enhanced: função logarítmica')
17 
18 it = arange(256)**2
19 adshow(iaapplylut(f, it), title = 'iaapply original: função quadrática')
20 adshow(iaapplylutEnhanced(f, it), title = 'iaapply enhanced: função quadrática')

iaapply original: função negativa

iaapply enhanced: função negativa

iaapply original: função logarítmica

iaapply enhanced: função logarítmica

iaapply original: função quadrática

iaapply enhanced: função quadrática

  1. 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
 1 #x = arange(0, 2*math.pi, 0.1)
 2 #y = math.sin(math.pi/2)
 3 #g, d = iaplot(x,y)
 4 #g('set data style impulses')
 5 #g('set grid')
 6 #g('set xlabel "X values" -20,0')
 7 #g('set ylabel "Y values"')
 8 #g('set title "Example Plot"')
 9 #g.plot(d, 'cos(x)')
10 
11 def drawPlot(Wi, Li, Wo, Lo):
12     x0,y0 = 0,0
13     x1,y1 = Li-round(Wi/2),Lo-round(Wo/2)
14     x2,y2 = Li+round(Wi/2),Lo+round(Wo/2)
15     x3,y3 = 255,255
16 
17     plot = arange(256)
18 
19     for i in range(x0,x3+1):
20         if (i < x1):
21             plot[i] = (y1/x1)*i #f(x)=ax+b, b=0 e a=y1/x1 => f(x)=y1/x1
22         elif (i < x2):
23             plot[i] = ((i-x1)*(y2-y1)/(x2-x1))+y1
24         else:
25             plot[i] = ((i-x2)*(y3-y2)/(x3-x2))+y2
26 
27     return [[plot]]
28 
29 def transf(inputImage, outputImage, inputRange, outputRange):
30     h,w = inputImage.shape
31 
32     for i in range(0,h): #realiza a varredura em toda a imagem
33         for j in range(0,w):
34             if (inputImage[i,j] >= inputRange[0] and inputImage[i,j] <= inputRange[1]): #caso o valor esteja no intervalo a ser alterado
35                 #interpola linearmente o valor de uma escala para outra
36                 outputImage[i,j] = ((inputImage[i,j]-inputRange[0])/(inputRange[1]-inputRange[0]))*(outputRange[1]-outputRange[0])+outputRange[0]
37     return outputImage
38 
39 #Será utilizada uma matriz de 256x256 para manipular a intensidade dos pixels da imagem
40 def iapplylut2(f, Wi, Li, Wo, Lo):
41     h,w = f.shape
42 
43     #define os arrays de range[min, max] de cada um dos 3 intervalos de entrada e dos 3 intervalos de saída
44     inputRange1 = array([0, Li-round(Wi/2)-1])
45     outputRange1 = array([0, Lo-round(Wo/2)-1])
46     inputRange2 = array([Li-round(Wi/2), Li+round(Wi/2)])
47     outputRange2 = array([Lo-round(Wo/2), Lo+round(Wo/2)])
48     inputRange3 = array([Li+round(Wi/2)+1, 255])
49     outputRange3 = array([Lo+round(Wo/2)+1, 255])
50 
51     #cria uma nova imagem, e aplica as transformações de intervalo uma a uma
52     new_f = copy(f)
53     new_f = transf(f, new_f, inputRange1, outputRange1)
54     new_f = transf(f, new_f, inputRange2, outputRange2)
55     new_f = transf(f, new_f, inputRange3, outputRange3)
56 
57     return new_f
58 
59 n,bins= histogram(f,256)
60 mmplot([[n]], ptitle='Histograma')
61 adshow(f, title = 'Imagem monocromática com 256 niveis de cinza')
62 
63 Wi,Li,Wo,Lo = 10,10,10,10
64 mmplot(drawPlot(Wi,Li,Wo,Lo),['set yrange [0:256]','set xrange [0:256]'], ptitle='Funcao de intensidade')
65 adshow(iapplylut2(f, Wi, Li, Wo, Lo), title = 'Imagem manipulada: função identidade Wi='+str(Wi)+' Li='+str(Li)+' Wo='+str(Wo)+' Lo='+str(Lo))
66 
67 Wi,Li,Wo,Lo = 40,80,200,120
68 mmplot(drawPlot(Wi,Li,Wo,Lo),['set yrange [0:256]','set xrange [0:256]'], ptitle='Funcao de intensidade')
69 adshow(iapplylut2(f, Wi, Li, Wo, Lo), title = 'Imagem manipulada Wi='+str(Wi)+' Li='+str(Li)+' Wo='+str(Wo)+' Lo='+str(Lo))
70 
71 Wi,Li,Wo,Lo = 60,40,230,122
72 mmplot(drawPlot(Wi,Li,Wo,Lo),['set yrange [0:256]','set xrange [0:256]'], ptitle='Funcao de intensidade')
73 adshow(iapplylut2(f, Wi, Li, Wo, Lo), title = 'Imagem manipulada Wi='+str(Wi)+' Li='+str(Li)+' Wo='+str(Wo)+' Lo='+str(Lo))
74 
75 Wi,Li,Wo,Lo = 50,175,230,122
76 mmplot(drawPlot(Wi,Li,Wo,Lo),['set yrange [0:256]','set xrange [0:256]'], ptitle='Funcao de intensidade')
77 adshow(iapplylut2(f, Wi, Li, Wo, Lo), title = 'Imagem manipulada Wi='+str(Wi)+' Li='+str(Li)+' Wo='+str(Wo)+' Lo='+str(Lo))

Imagem monocromática com 256 niveis de cinza

Imagem manipulada: função identidade Wi=10 Li=10 Wo=10 Lo=10

Imagem manipulada Wi=40 Li=80 Wo=200 Lo=120

Imagem manipulada Wi=60 Li=40 Wo=230 Lo=122

Imagem manipulada Wi=50 Li=175 Wo=230 Lo=122