Análise e Processamento de Imagem Rui Bernardes rcbengbiomed@gmail.com Case insensitive, excepto em comandos que interagem com o sistema operativo Regras que ajudam a interpretar o código comandos e keywords com a primeira letra maiúscula, ex: surface, data, charsize=2.0, color=180 vs. Surface, data, CharSize=2.0, Color=180 variáveis com a primeira letra sempre minúscula (embora possam existir outras maiúsculas), ex: data = FIndGen(11) buttonvalue = thisvalue prttodata = Ptr_New() data = FIndGen(11) buttonvalue = thisvalue prttodata = Ptr_New() Eng. Biomédica 2007/08 1
Caractere de continuação de linha $ info = { r:r, $ g:g, $ b:b } é equivalente a info = { r:r, g:g, b:b } Múltiplos comandos na mesma linha, caractere & a = 3 & b = 5 Comentários tudo o que se seguir a ; no inicio, ou não, de uma linha de comando ; isto é um comentário FOR j=0,10 DO BEGIN data = j*2 count = count + j ; actualiza count comentário inútil ENDFOR Contour, peak, lon, lat, XStyle=1, YStyle=1, /Follow, $ Levels=vals, C_Labels=[1,0,1,0,0,1,1,0] Contour é o nome do comando que se pretende correr, tudo o resto são parâmetros desse comando... As variáveis peak, lon, lat são parâmetros posicionais, que neste caso são parâmetros de entrada... Não é possível distinguir (sem conhecer os comandos em questão) se um parâmetro é de entrada, saída ou ambos... Os parâmetros posicionais têm uma ordem definida. Os parâmetros keyword não têm uma ordem definida e podem estar misturados com os posicionais (embora não seja uma boa ideia para a clareza do código). Exemplos: XStyle=1, YStyle=1, Levels=vals, C_Labels=[1,0,1,0,0,1,1,0]. As keyword parameters podem também ser usadas na forma /keyword, ex. /Follow, para o caso da parâmetros binários. Neste caso /Follow é o mesmo que Follow=1. O mesmo poderia ter sido feito com XStyle=1 (/XStyle), mas isso daria a impressão que XStyle seria binária, o que não é... Eng. Biomédica 2007/08 2
Procedimentos e Funções No caso das funções, os parâmetros posicionais e os parâmetros keyword são colocados entre parêntesis curvos (). No caso de um procedimento, os parâmetros são listados na linha de comandos. Ao contrário de um procedimento, uma função devolve obrigatoriamente um valor, que pode ser de qualquer um dos tipos definidos (escalares, vectores ou estruturas). Procedimentos e funções podem coexistir na mesma linha de comando. Ex: é o mesmo que: scaled = BytScl(image, Top=199, Min=0, Max=maxValue) TV, scaled TV, BytScl(image, Top=199, Min=0, Max=maxValue) Obter ajuda acerca de um comando, IDL>? <comando> Ex: IDL>? TVSCL Variáveis, podem ter até 255 caracteres de comprimento, devem começar por uma letra e podem conter o caracter $. As variáveis têm dois atributos importantes: o tipo de dados e a estrutura. Os tipos de dados encontram-se descritos na tabela seguinte (Tabela 1). A estrutura das variáveis podem ser do tipo: escalares (valores únicos) vectores (matrizes de dimensão 1) matrizes (até dimensão 8) estruturas (podem conter variáveis, de vários tipos, e estruturas) Eng. Biomédica 2007/08 3
Existem 14 tipos distintos de variáveis. Tabela 1 Data Type Size (bytes) Variable Creation Data Type Function Byte 1 var = 0B thisvar = Byte(variable) 16-Bit Signed Integer 2 var = 0 thisvar = Fix(variable) 32-Bit (Long) Signed Integer 4 var = 0L thisvar = Long(variable) 64-Bit Signed Integer 8 var = 0LL thisvar = Long64(variable) 16-Bit Unsigned Integer 2 var = 0U thisvar = UInt(variable) 32-Bit (Long) Unsigned Integer 4 var = 0UL thisvar = ULong(variable) 64-Bit Unsigned Integer 8 var = 0ULL thisvar = ULong64(variable) Floating Point 4 var = 0.0 thisvar = Float(variable) Double-Precision Floating 8 var = 0.0D thisvar = Double(variable) Complex 8 var = Complex(0.0, 0.0) thisvar = Complex(variable) Double-Precision Complex 16 var = DComplex(0.0D, 0.0D) thisvar = DComplex(variable) String 0-32767 var = ' ' or var = " " thisvar = String(variable) Pointer 4 var = Ptr_New() None Object 4 var = Obj_New() None O IDL está vocacionado para a operação com vectores/matrizes. Existem comandos para a inicialização destas variáveis, quer com zeros quer como sequências de índices. Tabela 2 Data Type Initialization Index Generating Byte BytArr BIndGen 16-Bit Signed Integer IntArr IndGen 32-Bit (Long) Signed Integer LonArr LIndGen 64-Bit Signed Integer Lon64Arr L64IndGen 16-Bit Unsigned Integer UIntArr UIndGen 32-Bit (Long) Unsigned Integer ULonArr ULIndGen 64-Bit Unsigned Integer ULon64Arr UL64IndGen Floating Point FltArr FIndGen Double Precision Floating DblArr DIndGen Complex ComplexArr CIndGen Double Precision Complex DComplexArr DCIndGen String StrArr SIndGen Pointer PtrArr None Object ObjArr None Eng. Biomédica 2007/08 4
Exemplos: array = BytArr(100, 100) vector = FIndGen(100) ; matriz de zeros de 100x100 (do tipo Byte) ; vector de 100 elementos (do tipo Floating Point) ; com valores 0, 1, 2,... 99 Os atributos de uma variável mudam dinamicamente. Exemplos: num = 3 Num = num * 5.2 ; num é do tipo inteiro (integer) ; num passa a ser do tipo floating point Cuidados com os inteiros... result = 12/5 ; result toma o valor 2 e não 2.4 porque ambos os ; números envolvidos são do tipo integer result = 12/5.0 ; result 2.4... Exemplo: determinar o aspect ratio do monitor. aspectratio =!D.Y_Size /!D.X_Size ; aspectratio é 0 aspectratio = Float(!D.Y_Size) /!D.X_Size ; aspectratio é 0.8 ; (dimx = 640 e dimy = 512) Um inteiro (integer) no IDL tem 2 bytes, logo o valor máximo possível de representar é de 32768. Se se pretender um contador com um limite superior é necessário garantir que utilizamos um inteiro do tipo long integer...exemplo: FOR j=0,50000 DO print, j ; erro de execução, 50000 está fora da ; gama de valores permitidos FOR j=0l,50000 DO print, j ; OK Eng. Biomédica 2007/08 5
Vectores e Matrizes Criar um vector: IDL> vector = [1, 2, 3] IDL> Help, vector VECTOR INT = Array[3] IDL> vector = [vector 4] IDL> Print, vector 1 2 3 4 Acesso com índices: IDL> Print, vector[0:2] 1 2 3 De notar que o primeiro índice é 0 (zero) ; a var vector é do tipo inteiro porque todos ; os elementos o são Criar uma matriz: IDL> matriz = [ [1, 2, 3], [4, 5, 6] ] IDL> Print, matriz 1 2 3 4 5 6 Isto significa que no IDL os vectores e as matrizes estão organizadas por linhas. IDL> Print, matriz[0,1] 4 NOTA: ao contrário da normal indexação das matrizes, o IDL toma como primeiro índice a coluna e como segundo índice a linha... IDL> Print, matriz[4] ; pode usar-se o indexamento simples 5 ; como resultado da organização por linhas... Eng. Biomédica 2007/08 6
Pode utilizar-se um vector de índices... IDL> indices = [0, 3, 5] IDL> Print, matriz[indices] 1 4 6 Extracção de vectores e submatrizes... ; matriz com 10 colunas e 20 linhas ; com valores aleatórios (pseudo-aleatórios) IDL> data = RandomU(seed, 10, 20) IDL> submatriz = data[5:9, 11:14] ; submatriz composta pelos dados da matriz data com as colunas 6 a 10 ; e linhas 12 a 15 IDL> Plot, data[7, *] ; faz o plot dos dados da 8ª coluna e todas a linhas (*) IDL> submatriz = data[5:*, *] ; submatriz composta pelos dados da matriz data com as colunas 6 até ao final ; e todas as linhas Existem 4 tipos do programas em IDL: * batch file * main-level IDL program * IDL procedure * IDL function IDL batch file conjunto de comandos tal como seriam introduzidos na linha de comandos. Para evocar este tipo de programa deve preceder-se o nome do mesmo por @. Exemplo: IDL> thisimage = BytScl(image, Top=199) IDL> LoadCT, 5, NColors=200 IDL> s = Size(image, /Dimensions) IDL> Window, /Free, XSize=s[0], YSize=s[1] IDL> TV, thisimage Eng. Biomédica 2007/08 7
teste.pro thisimage = BytScl(image, Top=199) LoadCT, 5, NColors=200 s = Size(image, /Dimensions) Window, /Free, XSize=s[0], YSize=s[1] TV, thisimage IDL> @teste.pro Main-level IDL program ao contrário do anterior, este módulo necessita de ser compilado e tem de terminar com END. teste2.pro thesefiles = FindFile('*.img', Count=numFiles) Print, 'Number of files found: ', numfiles FOR j=0,numfiles-1 DO BEGIN OpenR, lun, thesefiles[j], /Get_Lun image = BytArr(512, 512) ReadU, lun, image Free_Lun, lun thisimage = BytScl(image, Top=199) LoadCT, 5, NColors=200 s = Size(image, /Dimensions) Window, /Free, XSize=s[0], YSize=s[1] TV, thisimage ENDFOR END IDL>.RUN teste2 Eng. Biomédica 2007/08 8
IDL procedure program semelhante ao anterior. Na prática está a criar-se um novo comando que ficará disponível no IDL. Tem de começar pela declaração de definição de procedimento. teste3.pro PRO teste3 thesefiles = FindFile('*.img', Count=numFiles) Print, 'Number of files found: ', numfiles FOR j=0,numfiles-1 DO BEGIN OpenR, lun, thesefiles[j], /Get_Lun image = BytArr(512, 512) ReadU, lun, image Free_Lun, lun thisimage = BytScl(image, Top=199) LoadCT, 5, NColors=200 s = Size(image, /Dimensions) Window, /Free, XSize=s[0], YSize=s[1] TV, thisimage ENDFOR END IDL>.COMPILE teste3 IDL> teste3 IDL procedure program definição de parâmetros. teste4.pro PRO teste4, parametroposicional1, parametrokeyword1=varinsideproc numparameters = N_Params() IF numparameters EQ 2 THEN Print, varinsideproc END IDL>.COMPILE teste4 IDL> teste4, textparam, parametrokeyword1=4.27 Eng. Biomédica 2007/08 9
IDL function program semelhante ao caso anterior. Se não tiver uma declaração de Return, devolverá sempre 0 (zero), senão devolve o parâmetro de Return. teste5.pro FUNCTION teste5, parametroposicional1, parametrokeyword1=varinsideproc numparameters = N_Params() IF numparameters EQ 2 THEN Print, varinsideproc Return, numparameters END IDL> a = teste5 ( textparam, parametrokeyword1=4.27) Eng. Biomédica 2007/08 10