;------------------------------------------------------------------------------- ; Processament d'imatges. Curs 2004-2005 ; ; Practica 2 : Reconeixement d'envasos de Schweppes ; ; Alumnes : ; Data : ;-------------------------------------------------------------------------------- (load "morpho.lsp") (load "display.lsp") (loadlibrary "C:\\Dokumente\ und\ Einstellungen\\admin\\Eigene\ Dateien\\Eigene\ Dokumente\\uni\\imatges\\practica2\\ajutSchweppes\\sample2dll\\Debug\\mypolar.dll") ;--------------------- ; Llegeix una imatge ;--------------------- (defun Llegeix(nomima) (setq a (readim (strcat "pics/" nomima ".tif" ) 640 480)) ) ;------------------------------------------------------------- ; Pas a coordenades polars amb els parametres fixats a sota ; (variables globals) ;------------------------------------------------------------- (defun PasAPolar(ima xc yc) (rmgrad (mypolar ima xc yc RadiInicial RadiFinal NombreRadis AngleInicial AngleFinal NombreAngles ) 1 1 ) ;(mypolar ima xc yc RadiInicial RadiFinal NombreRadis AngleInicial AngleFinal NombreAngles ) ) ;---------------------------------------------------------------- ; Retorna la imatge model a punt de convolucionar per Fourier : ; haven fet el simetric respecte l'origen, desplasat l'origen al ; centre de l'etiqueta amb invqua. ; xc, yc es el centre per passar a polar ; x0p, y0p, x1p, y1p es el minim rectangle que inclou l'etiqueta ;---------------------------------------------------------------- (defun FerModel(nomima xc yc x0p y0p x1p y1p) (setq res (image 512 512)) (setq temp (PasAPolar (Llegeix nomima) xc yc )) ;(dw temp) (setq temp (getim temp x0p y0p x1p y1p)) (dw temp) (putim res (flipx (flipy temp )) 114 200) (invqua res) ) ;------------------------------------------------------------- ; Fa la correlacio entre dues imatges mitjansant la convolucio ; en el domini frequencial. Totes dues han de tenir la mateixa ; mida, ser quadrades i de dimensio potencia de 2 ;------------------------------------------------------------- (defun Correlacio(imatest) ;C = real(ifft2(fft2(bw) .* fft2(rot90(a,2),256,256))); ) ;------------------------------------------------------------- ; Calcul de la mesura de la similitud ;------------------------------------------------------------- (defun Similitud(llistadadestest) ; llista composada per (nom-imatge, xc, yc) (setq nomima (first llistadadestest)) (setq xc (second llistadadestest)) (setq yc (third llistadadestest)) (print nomima) (setq t (PasAPolar (Llegeix nomima) xc yc )) ;(dw t) (setq ima (putim (image 512 512) t 0 0)) (setq fftima (fft (imtocomplex ima))) (setq resinv (complextore (fft_1 (* fftima fftmodel) ))) (setq resinvdiv ( / resinv (* 512 512))) (setq mp (maxpix resinvdiv)) (setq resinvthr (thr resinvdiv (- mp 10) 1 0 ) ) (setq sum (vol resinvthr)) ;(dw (imtobyte (thr resinvthr 1))) ; otro model (setq resinv2 (complextore (fft_1 (* fftima fftmodel2) ))) (setq resinvdiv2 ( / resinv2 (* 512 512))) (setq mp2 (maxpix resinvdiv2)) (setq resinvthr2 (thr resinvdiv2 (- mp2 10) 1 0 ) ) (setq sum2 (vol resinvthr2 )) ;(dw (imtobyte (thr resinvthr 1))) ;(dw (imtobyte resinv)) ;(dw (imtobyte resinvdiv)) (print mp) (print mp2) ;(print sum) ;(print sum2) mp ;(print mp) ;(setq res (imtobyte resinv)) ;(print (maxpix res)) ;(setq res (conv ima model)) ;(dw res) ; ; comprobacio de coordenades de centre xc, yc ben donades ; ;(waitdisplay (drawcir (drawrect t (- xc 1)(- yc 1) ; (+ xc 1)(+ yc 1) 255) ; xc yc 193 255)) ; ;(princ nomima) (princ " ") (princ res) (princ "\n") ;res ) ;-------------------------------------------------------------------------- ; serveix per fusionar la lista de noms d'imatge amb la llista de resultats ; i aixi construir una taula de parelles (nom, mesura de similitud) ;-------------------------------------------------------------------------- (defun merge(l1 l2) (list (car l1) l2) ) ;-------------------------------------------------------------------------- ; A partir d'un vector de mesures de similitud, retorna una imatge amb una ; grafica que les representa, separant els envasos bons dels dolents. ;-------------------------------------------------------------------------- (defun grafica(mesures nombrebons) (setq g (image 'float mesures)) (max (drawrect (image (* 4 (imncol g)) 512) 0 0 ( + 2 (* 4 (- nombrebons 2))) 511 128) (- 255 (plot (maxcon g) (* 4 (imncol g)) 512)) ) ) ;------------------------------------------------------------------------- ; Comparacio de temps entre correlacio en el domini espacial i frequencial ;------------------------------------------------------------------------- (defun ComparacioTemps() (print "Temps domini espacial") (setq t1 (wtime)) (setq t2 (wtime)) (print (- t2 t1)) (print "Temps domini frequencial (sense comptar la fft del model, que es fa 1 cop nomes)") (setq t1 (wtime)) (setq t2 (wtime)) (print (- t2 t1)) NIL ) ;---------------------------------------- ; Funcio principal ;---------------------------------------- (defun Reconeix() ;(setq ttotal1 (wtime)) (setq mesures (mapcar 'Similitud envasos)) ;(setq ttotal2 (wtime)) ;(setq tpromig (/ (- ttotal2 ttotal1) (float (length envasos)))) ; mostrem resultats graficament ; (display (grafica mesures (length schweppes))) ; fem una taula de resultats = llista de parelles (nom, maxim de la correlacio) ; (setq resultats (mapcar 'merge envasos mesures)) (pprint resultats) ;(princ "Temps promig de classificacio :") ;(print tpromig) ) ;------------------------------------------- ; Dades : noms d'imatge i coordenades centre ;------------------------------------------- (setq schweppes (list ; envas rotat 45 graus cada cop (list "schwe1-1" 284 230) ;(list "schwe1-2" 290 229) model (list "schwe1-3" 298 244) (list "schwe1-4" 296 243) ; envas traslladat a les 4 cantonades (list "schwe2-1" 299 219) (list "schwe2-2" 284 241) (list "schwe2-3" 282 237) (list "schwe2-4" 285 218) ; envas de schweppes de llimona, en posicions i rotacions arbitraries (list "schwe3-1" 295 237) (list "schwe3-2" 287 229) (list "schwe3-3" 298 226) (list "schwe3-4" 298 223) (list "schwe3-5" 293 223) ; idem, taronja (list "schwe4-1" 283 229) (list "schwe4-2" 296 228) (list "schwe4-3" 292 230) (list "schwe4-4" 284 220) (list "schwe4-5" 294 220) ; idem, envas de soda (etiqueta de fons negre i lletres blanques, ; lletres potser mes petites : cal un nou model ?) (list "schwe5-1" 290 231) (list "schwe5-2" 282 234) (list "schwe5-3" 298 227) (list "schwe5-4" 288 231) (list "schwe5-5" 299 224) ; etiqueta taronja o llimona amb petits estrips (list "schwe6-1" 294 234) (list "schwe6-2" 287 228) (list "schwe6-3" 303 214) (list "schwe6-4" 278 214) (list "schwe6-5" 275 215) ; la meitat de l'etiqueta arrencada (list "estripa1" 281 216) (list "estripa2" 278 224) (list "estripa3" 286 225) (list "estripa4" 301 230) )) (setq models (list (list "schwe1-2" 290 229) )) (setq altres (list (list "borges1" 296 239) (list "borges2" 283 231) (list "borges3" 282 212) (list "borges4" 278 214) (list "borges5" 287 209) (list "carbone1" 293 217) (list "carbone2" 293 243) (list "carbone3" 286 210) (list "fontvel1" 272 217) (list "fontvel2" 302 245) (list "fontvel3" 298 241) (list "fontvel4" 303 235) (list "fontvel5" 301 245) (list "lacaser1" 290 231) (list "lacaser2" 290 239) (list "lacaser3" 290 230) (list "lacaser4" 291 227) (list "lacaser5" 290 231) (list "noetiq1" 285 234) (list "noetiq2" 285 224) (list "oli1" 286 231) (list "oli2" 278 226) (list "oli3" 283 224) (list "pepsi1-1" 287 233) (list "pepsi1-2" 297 242) (list "pepsi1-3" 287 241) (list "pepsi1-4" 292 241) (list "pepsi1-5" 279 237) (list "pepsi2-1" 289 234) (list "pepsi2-2" 289 227) (list "pepsi2-3" 288 237) (list "pepsi2-4" 289 237) (list "pepsi2-5" 290 230) (list "reves1" 310 260) ; no tenen centre pero cal reconeixer-les com no schweppes ; (list "reves2" 310 260) ; (list "reves3" 310 260) ; (list "reves4" 310 260) ; (list "reves5" 310 260) (list "trina1-1" 287 230) (list "trina1-2" 287 230) (list "trina1-3" 287 230) (list "trina1-4" 287 230) (list "trina1-5" 287 230) (list "trina2-1" 287 231) (list "trina2-2" 287 231) (list "trina2-3" 287 231) (list "trina2-4" 287 231) (list "trina2-5" 287 231) ; no te centre per que no hi ha envas, per cal reconeixer-ho (list "fons" 289 233) )) (setq testlist (list (list "schwe4-1" 283 229) (list "schwe4-2" 296 228) (list "schwe4-3" 292 230) (list "schwe4-4" 284 220) (list "schwe4-5" 294 220) ; idem, envas de soda (etiqueta de fons negre i lletres blanques, ; lletres potser mes petites : cal un nou model ?) (list "schwe5-1" 290 231) (list "schwe5-2" 282 234) (list "schwe5-3" 298 227) (list "schwe5-4" 288 231) (list "schwe5-5" 299 224) ; etiqueta taronja o llimona amb petits estrips (list "schwe6-1" 294 234) (list "schwe6-2" 287 228) (list "schwe6-3" 303 214) (list "schwe6-4" 278 214) (list "schwe6-5" 275 215) ; la meitat de l'etiqueta arrencada (list "estripa1" 281 216) (list "estripa2" 278 224) (list "estripa3" 286 225) (list "estripa4" 301 230) )) (setq envasos (append schweppes altres)) ;----------- ; Constants ;----------- (setq PI 3.141592) ;------------------------------------------------- ; Variables globals que son parametres de funcions ;------------------------------------------------- ; Pel pas a coordenades polars (setq RadiInicial 120.0) (setq RadiFinal 180.0) (setq NombreRadis (* 2 (truncate (- RadiFinal RadiInicial)))) (setq AngleFinal 0.0) (setq NombreAngles 512) ;(setq AngleInicial (- (* 2 PI) (/ (* 2 PI) (- NombreAngles 1)))) (setq AngleInicial (- (* 2 PI) (/ (* 2 PI) NombreAngles ))) (setq OrdreInterp 1) ; Construccio del model i calcul de la seva transformada de Fourier ; que no cal repetir per a cada avaluacio de la mesura de similitud ;(setq dm (first schweppes)) ; model = schwe1-1 ;(setq x0p 230 ; y0p 4 ; x1p 510 ; y1p 119) ; rectangle que inclou l'etiqueta ; Descomentar quan estigui feta FerModel ;(setq Raditemp RadiInicial) ;(setq Finaltemp RadiFinal) ;(setq RadiInicial 130.0) ;(setq RadiFinal 190.0) (setq model2 (FerModel "schwe4-2" 296 228 142 9 424 119 )) ;(setq RadiInicial Raditemp) ;(setq RadiFinal Finaltemp) (setq model (FerModel "schwe1-2" 290 229 108 0 390 110 )) (setq fftmodel (fft (imtocomplex model))) (setq fftmodel2 (fft (imtocomplex model2))) ;----------------------------------- ; Crida a les funcions principals ;----------------------------------- ; (Reconeix) ; (ComparacioTemps) ; Crea una imatge amb totes les etiquetes a polars per ; verificar si els centres son correctes (defun TotesPolar(l) (PasAPolar (llegeix (first l)) (second l) (third l)) ) ; (setq tp (apply 'addlin (mapcar 'TotesPolar schweppes))) (defun mySimilitud(name) (setq envasos (append (cdr schweppes) altres)) (setq l (length envasos)) (setq resu NIL) (dotimes (d l NIL) (cond ( (string= (first (nth d envasos)) name ) (print (first (nth d envasos))) (setq resu (Similitud (nth d envasos))) ) ) ) resu ) (defun test2() (Similitud (first models)) ) (defun test() (mySimilitud "schwe1-3") (mySimilitud "schwe2-1") (mySimilitud "schwe3-5") (mySimilitud "schwe5-1") (mySimilitud "schwe6-1") (mySimilitud "borges1") (mySimilitud "carbone1") (mySimilitud "fontvel1") (mySimilitud "lacaser1") (mySimilitud "pepsi1-1") (mySimilitud "pepsi2-4") (mySimilitud "trina2-2") (mySimilitud "noetiq1") (mySimilitud "oli1") ) (defun test3() (setq mesures (mapcar 'Similitud schweppes)) (setq resultats (mapcar 'merge schweppes mesures)) (pprint resultats) ) (defun test4(llistadadestest) (setq nomima (first llistadadestest)) (setq xc (second llistadadestest)) (setq yc (third llistadadestest)) (print nomima) (setq t (PasAPolar (Llegeix nomima) xc yc )) (dw t) ) (defun test5(l) (setq mesures (mapcar 'Similitud l)) (setq resultats (mapcar 'merge l mesures)) (pprint resultats) ) (defun nuwrp(llistadadestest) (setq nomima (first llistadadestest)) (setq xc (second llistadadestest)) (setq yc (third llistadadestest)) (setq ima (Llegeix nomima)) (dw (nu 0.0 0)) ) (defun nu(nu cn) (setq AngleFinal (+ 0.0 nu )) (setq AngleInicial (+ (- (* 2 PI) (/ (* 2 PI) (- NombreAngles 1))) nu )) (setq bild (rmgrad (mypolar ima xc yc ini fin tama AngleInicial AngleFinal NombreAngles) 1 1)) (setq lbild (getim bild 0 0 254 79)) (setq rbild (getim bild 255 0 511 79)) (setq lbildk (thr (getim bild 199 40 254 79) 80 1 0)) (setq rbildk (thr (getim bild 255 40 310 79) 80 1 0)) ;(dw bild) ;(dw (addcol lbild rbild)) (setq vl (float (vol lbild))) (setq vr (vol rbild)) (setq sum (vol (addcol lbildk rbildk))) (cond ( (or (> cn 70) (and (> sum 50 ) (< (/ vl vr) 1 ) ( > (/ vl vr) 0.9 ) )) (print sum) (print vl) (print vr) ;(dw (thr lbildk 1 )) ;(dw (thr rbildk 1 )) (print (/ vl vr)) (print cn) bild ) ( T (nu (+ nu 0.1) (+ cn 1) ) ) ) )