Appendice D
Algoritmi in MatLab®
Analisi delle immagini SEM e AFM per ricavare le lunghezze d'onda a partire dai
dati ottenuti dalla PSDF calcolata in Gwyddion®:
Importazione dei dati
% Import dei dati
newData1 = importdata('data.txt');
% Creazione delle nuove variabili nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data1=data;
Implementazione dell'algoritmo
clc close all
img = imread('immagine.tif','tif'); % importo l'immagine SEM o AFM in formato .tif
%Operazioni per visualizzare e convertire l'immagine in scala di grigi a 8 bit
imagesc(img); colormap(gray); colorbar;
img8 = uint8( (double(img) - double(min(img(:)))) / (double(max(img(:))) - double(min(img(:)))) * 255 ); figure
plot(data(:,1),data(:,2))
%Distribuzione delle lunghezze d'onda in funzione della probabilità A=data(:,2); massimo=max(A); minimo=min(A); dati=A./massimo; B=data(:,1); lambda=1./B; lambda2=(2*pi).*(lambda); figure plot(lambda2,dati)
title('distribuzione lunghezze d onda') xlabel('lambda m')
ylabel('probabilità')
115
%funzione;l'operazione (di ottimizzazione) è stata effettuata due %volte per visualizzare in maniera ottimale i massimi locali. [valori,indici] = findpeaks(dati); for i=1:length(indici) lambda2_i(i)=lambda2(indici(i)); end figure plot(lambda2_i,valori)
title('prima ottimizzazione') xlabel('lambda m') ylabel('probabilità') [valori2,indici2] = findpeaks(valori); for i=1:length(indici2) lambda2_i_i(i)=lambda2_i(indici2(i)); end figure plot(lambda2_i_i,valori2) xlabel('lambda m') ylabel('probabilità %')
title('seconda ottimizzazione')
Analisi delle immagini AFM per ricavare le altezze a partire dai dati relativi a tre
profili diversi di tre immagini diverse importate in Gwyddion®:
Programma di esecuzione
clear all
close all
clc
% Import del file
newData1 = importdata('profilo1.txt');
% Creazione di nuove variabili nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data1=data;
% Import del file2
newData1 = importdata('profilo2.txt'); % Creazione nuova variabile nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data2=data;
% Import del file3
newData1 = importdata('profilo3.txt'); % Creazione nuova variabile nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
116
% Import del file4
newData1 = importdata('profilo1.2.txt'); % Creazione nuova variabile nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data4=data;
% Import del file5
newData1 = importdata('profilo2.2.txt'); % Creazione nuova variabile nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data5=data;
% Import del file6
newData1 = importdata('profilo3.2.txt');
% Create new variables in the base workspace from those fields. vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data6=data;
% Import del file7
newData1 = importdata('profilo1.3.txt'); % Creazione nuova variabile nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data7=data;
% Import del file8
newData1 = importdata('profilo2.3.txt'); % Creazione nuova variabile nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
data8=data;
% Import del file9
newData1 = importdata('profilo3.3.txt'); % Creazione nuova variabile nel workspace vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end data9=data; D1=calcola(data1); D2=calcola(data2); D3=calcola(data3); D4=calcola(data4); D5=calcola(data5);
117
D6=calcola(data6); D7=calcola(data7); D8=calcola(data8); D9=calcola(data9); D=[D1 D2 D3 D4 D5 D6 D7 D8 D9];%Condizione sul vettore D per trovare le sue macro-famiglie di altezze i=1; j=1; m=1; k=1; s=1; t=1; h_min=[]; h_max=[]; ord=sort(D); ord1=sort(D1); ord2=sort(D2); ord3=sort(D3); ord4=sort(D4); ord5=sort(D5); ord6=sort(D6); ord7=sort(D7); ord8=sort(D8); ord9=sort(D9);
% Creazione un vettore con altezze maggiori di 10^(-7)
for k=1:length(ord) if (ord(k)<=(100*10^(-9))) ord_new(s)=ord(k); s=s+1; else ordnew2(t)=ord(k); t=t+1; end end
% Selezione le altezze di interesse utilizzando come soglia 10^(-6)
for i=1:length(ordnew2) if (ordnew2(i)<=(10^(-6))) h_min(j)=ordnew2(i); j=j+1; else h_max(m)=ordnew2(i); m=m+1; end end
%Calcolo della media e deviazione standard delle altezze massime e minime
h_min_ord=sort(h_min); media1=mean(h_min) media2=mean(h_max)
118
devst1=std(h_min) devst2=std(h_max) figure
edge=min(ordnew2):1*10^-7:max(ordnew2);
f1=histc(ordnew2,edge); %conta quanti valori ci sono nell'intervallo [edges] %histc non richiede che il vettore D sia ordinato
freq_rel1=f1/length(ordnew2); %divide f per il numero totale di ossrvazioni e si ottiene così il numero delle frequenze relative dei sottointervalli
bar(edge,freq_rel1,'histc')
title('distribuzione delle altezze') xlabel('intervallo di valori altezze') ylabel('frequenza relativa')
Funzione "calcola" richiamata dal programma precedente
function dist=calcola(data)
x=data(:,1); %estrapola la prima colonna y=data(:,2); %estrapola la seconda colonna %Inizializzazione variabile:
%variabile mini inizializzata con il valore massimo del vettore mini=max(y);
%variabile maxi inizializzata con il valore minimo del vettore ma in questo caso lo zero va bene perché non ho un valore più
piccolo
maxi=0;
i=1; %variabile del ciclo for
j=1; %variabile per il vettore dist dato in uscita
%viene imposta una condizione per capire se parto con una funzione crescente o decrescente
if(y(1)>y(2))
move=1; %move = 1 se il valore decresce; % move viene vista come variabile booleana
maxi=y(1); else
move=0; %move = 0 se il valore cresce; mini=y(1);
end
%Inizio elaborazione della funzione: for i=1:length(y)
if(move == 1) %se la funzione decresce if(mini>y(i))
mini=y(i); else
119
%si salta la condizione dell'if perchè si sta crescendo e la variabile move assume valore zero
dist(j)=maxi-mini; j=j+1; maxi=y(i-1); end else if(maxi<y(i)) maxi=y(i); else move=1; mini=y(i-1); end end end end