A
A
P
P
P
P
E
E
N
N
D
D
I
I
C
C
E
E
A
A
L
L
C
C
A
A
P
P
I
I
T
T
O
O
L
L
O
O
4
4
In questa appendice sono riportati i programmi Matlab che implementano gli algoritmi di elaborazione delle immagini descritti nel Capitolo 4. Per alcune parti dei programmi verranno anche fornite informazioni più dettagliate; per le parti in cui ciò non accade si rimanda all’Help dello stesso software.
B.1 Algoritmo di elaborazione manuale
Il programma Matlab listato di seguito implementa i blocchi del diagramma di flusso l’algoritmo di elaborazione manuale posti a valle di quello relativo alla “Selezione dell’asse di rotazione dell’induttore” (vedi Figura 4.17).Questo blocco è presente nel programma che permette l’elaborazione dei filmati digitali (vedi Sezione C.1).
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 % Programma che permette di selezionare diverse zone di 3 % un'immagine e di dare,all'interno di queste, 4 % un valore di soglia mediante il quale l'immagine 5 % viene trasformata in immagine binaria
6 %--- 7 % SINTASSI:
8 % I2=elaborazione_man(I) 9 % INPUT:
10 % I =immagine in scala di grigio 11 % OUTPUT:
12 % I2=immagine segmentata (binaria)
13 %--- 14 % NOTE: è utilizzato dal programma di elaborazione dei filmati 15 % digitali 16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17 function I3=elaborazione_man(I) 18 close all 19 clc 20 21 opz=1; 22 23 k=1; 24 while opz == 1
25 mask=roipoly(I); % permette di selezionare una zona all'interno dell'immagine
26 I2=immultiply(I,mask); % rende nera la parte di immagine che sta fuori dalla zona selzionata
27 soglia=graythresh2(I2);
28 im_part(:,:,k)=im2bw(I2,soglia); % applicazione della tecnica del valore di soglia
29 confronto(I,im_part(:,:,k));
30 j=menu('Vuoi modificare il valore di soglia?','Si','No');% eventuale modifica del valore di soglia
31 if j==1
32 disp('Il valore di soglia di primo tentativo è') 33 disp( num2str(soglia*255) ) 34 end
35 while j==1 % Ciclo iterativo per il settaggio del valore di soglia
36 soglia=input('Inserire il nuovo valore di soglia'); 37 im_part(:,:,k)=im2bw(I2,soglia/255);
38 confronto(I,im_part(:,:,k));
39 j=menu('Vuoi modificare il valore di soglia?','Si','No'); 40 end
41 opz=menu('Vuoi selezionare altre regioni?','Si','No'); % selezione di altre zone all'interno dell'immagine
42 close all 43 k=k+1; 44 end
45 [m n p]=size(im_part); 46
47 % unione di tutte le zone selezionate e modificate in un'unica 48 % immagine binaria 49 I3(:,:)=im_part(:,:,1); 50 for i=2:p 51 I3(:,:)=I3(:,:)+im_part(:,:,i); 52 end 53 for i=1:m 54 for j=1:n 55 if I3(i,j)>1 56 I3(i,j)=1; 57 end 58 end 59 end 60 clc 61 %---
B.2 Elaborazione automatica dell’immagine
Questo programma implementa il blocco denominato “Elaborazione automatica dell’immagine” presente nel diagramma di flusso dell’algoritmo semi-automatico (Figura 4.24.
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 % Programma che esegue l'elaborazione automatica
3 % dell'immagine e che produce l'immagine di primo tentativo
4 % nell'algoritmo semi-automatico 5 %---
6 % SINTASSI:
7 % I2=elaborazione_aut(I) 8 % INPUT:
9 % I =immagine in scala di grigio 10 % OUTPUT:
11 % I2=immagine segmentata automaticamente (binaria) 12 %--- 13 % NOTE: è utilizzato dal programma di elaborazione dei filmati 14 % digitali
15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 function I4=elaborazione_aut(I)
17
18 % Creazione della maschera che annerisce la zona centrale 19 % dell'immagine e quella esterna all'induttore
20 r1=55; 21 r2=78; 22 ang=0:pi/180:2*pi; 23 x1=30+r1*(1-cos(ang)); 24 x2=8+r2*(1-cos(ang)); 25 y1=30+r1*(1+sin(ang)); 26 y2=8+r2*(1+sin(ang)); 27 mask1=roipoly(I,y1,x1); 28 mask2=roipoly(I,y2,x2); 29 mask1=not(mask1); 30 mask=immultiply(mask1,mask2); 31 I2=immultiply(I,mask); 32
33 % Divisione dell'immagine in settori circolari e settaggio del 34 % valore di soglia in ogni settore
35
36 k=1;
37 ang_space=15;
39 x1=[86 85*(1+sin(ang1)) ... 85*(1+sin(ang1-ang_space*(pi/180)))]; 40 y1=[86 85*(1-cos(ang1)) ... 85*(1-cos(ang1-ang_space*(pi/180)))]; 41 mask1=roipoly(I2,x1,y1); 42 I3=immultiply(I2,mask1); 43 [i,j,v]=find(I3); 44 v=double(v);
45 if std(v)<0.13*mean(v) % caso in cui la deviazione standard del settore è bassa
46 T=1; 47 else 48 T=graythresh2(I3); 49 end 50 im_part(:,:,k)=im2bw(I3,T); 51 media(k)=mean(v); 52 s_dev(k)=std(v); 53 soglie(k)=T; 54 k=k+1; 55 end
56 matr=[media' (s_dev./media)' (soglie*255)']; 57
58 % unione di tutte le zone selezionate e modificate in un'unica 59 % immagine binaria 60 [m n p]=size(im_part); 61 I4(:,:)=im_part(:,:,1); 62 for i=2:p 63 I4(:,:)=I4(:,:)+im_part(:,:,i); 64 end 65 for i=1:m 66 for j=1:n 67 if I4(i,j)>1 68 I4(i,j)=1; 69 end 70 end 71 end 72 clc 73 %---
B.3 Programmi ausiliari
B.3.1 Confronto tra le immagini originali e quelle elaborate
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 % Programma che permette di fare il confronto tra il 3 % fotogramma originale e quello modificato
4 %--- 5 % SINTASSI:
6 % h=confronto(I,I2) 7 % INPUT:
8 % I = immagine originale (in scala di grigio) 9 % I2 = immagine modificata (binaria)
10 % OUTPUT:
11 % h = immagine che mostra il confronto
12 %--- 13 % NOTE: è usato dal programma di elaborazione dei filmati 14 % digitali
15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 function h=confronto(I,I2)
18 % Rilevamento dei contorni delle zone bianche nel fotogramma 19 % modificato
20 BW=edge(I2); 21
22 % Sovrapposizione del contorno sull'immagine originale 23 [x,y]=find(BW);
24 h=figure; 25 imshow(I); 26 hold on
27 line(y,x,'LineStyle','none','Marker','.','MarkerEdgeColor',...
'r') 28 hold off
29 %---
B.3.2 Calcolo dell’istogramma delle zone selezionate con l’algoritmo manuale
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 % Programma che permette di ricavare l'istogramma della 3 % porzione di immagine selezionata con
4 % l'algoritmo manuale
5 %--- 6 % SINTASSI:
7 % istogramma(I) 8 % INPUT:
9 % I = immagine contenente la zona selezionata 10 % OUTPUT:
11 % istogramma della zona selezionata
12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 function istogramma(I)
14
15 [counts,x] = imhist(I); % counts=numero di pixels che hanno valore grayscale x
16 counts(1)=0; % elimina i pixels neri dall'istogramma 17 18 % Plottaggio dell'istogramma 19 plot(x,counts) 20 grid 21 axis([0 255 0 max(counts)]) 22 %---
B.3.3 Calcolo della deviazione standard dei settori circolari dell’immagine
Questo programma permette di ottenere grafici quali quelli di Figura 4.26 che permettono capire qual è il valore di soglia da impostare al rigo 45 del programma presente nella Sezione B.2. Prima dell’utilizzo di tale programma bisogna modificare la stringa presente al rigo 8 relativa al nome del file contenente il filmato.
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 % Programma per il calcolo della deviazione standard in 3 % funzione di theta per il primo frame di un filmato
4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5
6 % Lettura del primo frame di un filmato e selezione dell'asse 7 % di rotazione dell'induttore
8 M1=aviread('phi0_053sig0_57',1); 9 I=frame2im(M1);
10 I=rgb2gray(I); 11 figure
12 axis ij
13 title('Selezionare l''asse di rotazione dell''induttore ...
(doppio click)') 14 hold on 15 [x_c y_c P]=impixel(I); 16 hold off 17 I=imcrop(I,[x_c-85 y_c-85 170 170]); 18
19 % Creazione della maschera che annerisce la zona centrale 20 % dell'immagine e quella esterna all'induttore
21 r1=55; 22 r2=82; 23 ang=0:pi/180:2*pi; 24 x1=30+r1*(1-cos(ang)); 25 x2=4+r2*(1-cos(ang)); 26 y1=30+r1*(1+sin(ang)); 27 y2=4+r2*(1+sin(ang)); 28 mask1=roipoly(I,y1,x1); 29 mask2=roipoly(I,y2,x2); 30 mask1=not(mask1); 31 mask=immultiply(mask1,mask2); 32 I2=immultiply(I,mask); 33 34 %--- 35 % andamento di media e deviazione std in funzione di theta 36 %--- 37 k=1;
38 ang_space=1;
39 for ang1=ang_space*(pi/180):ang_space*(pi/180):2*pi
40 x1=[86 85*(1+sin(ang1)) 85*(1+sin(ang1-ang_space*(pi/180)))]; 41 y1=[86 85*(1-cos(ang1)) 85*(1-cos(ang1-ang_space*(pi/180)))]; 42 mask1=roipoly(I2,x1,y1); 43 I3=immultiply(I2,mask1); 44 [i,j,v]=find(I3); 45 v=double(v); 46 media(k)=mean(v); 47 s_dev(k)=std(v); 48 k=k+1; 49 end 50 std_norm=100*(s_dev./media); 51 matr=[media' std_norm']; 52 std_norm(length(std_norm)+1)=std_norm(1); 53 theta=ang_space:ang_space:360; 54
55 % Grafico della deviazione standard in funzione di theta 56 plot(theta,matr(:,2))
57 axis([0 360 0 100]) 58 xlabel('\theta [deg]')
59 ylabel('deviazione standard [% della media]') 60 grid