• Non ci sono risultati.

Appendice D Algoritmi in MatLab®

N/A
N/A
Protected

Academic year: 2021

Condividi "Appendice D Algoritmi in MatLab®"

Copied!
6
0
0

Testo completo

(1)

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à')

(2)

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

(3)

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);

(4)

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)

(5)

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

(6)

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

Riferimenti

Documenti correlati