Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduzione a Matlab
I fondamenti & LImage Processing
Informazioni:
Email: giacomo.scarciofalo@alice.it cspampin@diit.unict.it Sito web: www.campusone.ing.unict.it Orario di ricevimento: Gioved 16:00-18:00 Studio: Dip. di Ing. Informatica e delle Telecomunicazioni, stanza Prof.A.Faro tel. 095-7382372
Introduzione:
Il programma MATLAB Il programma nato principalmente come programma destinato alla gestione di matrici. Le versioni successive sono state completate con serie di funzioni che permettono le pi le pi complesse analisi numeriche, adatte ad esempio allanalisi e alla soluzione di problemi di controllo e allimage processing.
Introduzione:
La linea di comando di MATLAB indicata da un prompt come in DOS: >> Accetta dichiarazioni di variabili, espressioni e chiamate a tutte le funzioni disponibili nel programma. Tutte le funzioni di MATLAB non sono altro che files di testo, simili a quelli che lutente pu generare con un text editor e vengono eseguite semplicemente digitandone il nome sulla linea di comando. MATLAB permette inoltre di richiamare le ultime righe di comandi inseriti usando le frecce in alto e in basso.
Help di Matlab
MATLAB presenta un help in linea con informazioni sulla sintassi di
tutte le funzioni disponibili. Per accedere a queste informazioni, basta digitare: help nome_funzione
E anche possibile avere un help di tutte le funzioni della stessa
categoria; ad esempio per sapere quale sono le funzioni per lanalisi ed il controllo dei sistemi dinamici basta digitare: help control Per sapere quali sono le categorie dei toolbox disponibili basta digitare semplicemente help
Files in Matlab
I files interpretati dal programma sono file di testo ASCII con
estensione.m; sono generati con un text editor e eseguiti in MATLAB semplicemente digitandone il nome sulla linea di comando (senza senza estensione estensione!). E possibile inserire dei commenti al loro interno precedendo ogni linea di commento con il carattere speciale percento % Attenzione!:Pu essere utile andare nelle directories dove si trova il programma ed analizzare come le varie funzioni sono state implementate. Ci possibile perch ogni funzione ed ogni comando MATLAB richiama un file.m
Punteggiatura e variabili
Le istruzioni(siano esse contenute in un file.m lanciato da MATLAB,
oppure digitate direttamente dalla linea di comando) vanno sempre terminate con un punto e virgola, altrimenti verr visualizzato il risultato dellistruzione. Esempio: var1 = 6;
Nozioni generali(1)
Alcuni costrutti in MATLAB permettono la concatenazione di diverse
istruzioni;queste vanno separate dalla virgola; Esempio: if flag ==0 istruzioni separate da virgole; end;
Le variabili seguono le regole dei linguaggi di programmazione come
Pascal o il C. MATLAB case sensitive e accetta nomi di variabili lunghi fino ad un massimo di 19 caratteri alfanumerici, con il primo obbligatoriamente alfabetico.
Nozioni generali(2)
Per visualizzare il contenuto di una variabile sufficiente digitare il
precisione, ma si possono visualizzare in formato diverso usando i comandi: format short virgola fissa con 4 decimali format long virgola fissa con 15 decimali .. .. Il risultato dellultima operazione contenuto nella variabile ans.
specificata; save: salva tutte le variabili in memoria sul file specificato, in vari formati; load: richiama in memoria le variabili salvate sul file specificato; diary: salva sul file di testo ASCII diary quanto da quel momento appare sulla linea di comando; what: elenco di tutte le funzioni MATLAB nellarea di lavoro(estensione.m) e dei file di dati che sono stati salvati(estensione.mat).
Operatori scalari
Gli operatori disponibili sono: +,-,*,/,^, sin,cos,tan asin,acos,atan exp,log(naturale),log10(in base 10) abs,sqrt,sign
Attenzione! Ricordarsi sempre che quando si fanno operazioni tra matrici importante lordine dei fattori.
max, min - sort - sum, prod - Median Esistono poi particolari operatori (.*, ./,.^) che permettono di effettuare operazioni su vettori elemento per elemento, senza ricorrere a cicli. Ad esempio, se x un vettore, per moltiplicare elemento per elemento i due vettori sin(x) e cos(x) basta fare: y = sin(x) .* cos(x);
-
Inv inversa di una matrice Det determinante di una matrice Size dimensioni della matrice Rank rango di una matrice Eig autovalori ed autovettori Attenzione!:tutte le funzioni che operano su matrici hanno dei vincoli sugli operandi introdotti. Ad esempio non si pu invertire una matrice non quadrata. Per ulteriori spiegazioni usare il comando help del MATLAB.
- eye(n): matrice identit n righe ed n colonne; - zeros(m.n): matrice di zero con m righe ed n colonne; - ones: matrice di uno con m righe ed n colonne; - rand:(m,n): matrice casuale di valori tra zero e uno; - diag(x): se x un vettore con n elementi, produce una matrice quadrata diagonale di dimensione n x n con gli elementi di x sulla diagonale. Se invece X una matrice quadrata di dimensione n x n produce un vettore di n elementi pari a quelli sulla diagonale di X.
If Then - Else
La forma generale del costrutto if-then-else la stessa di un qualsiasi
linguaggio di programmazione: If condizione1, operazioni1; elseif condizione2, operazioni2; else operazioni3; end;
Condizione1,2 devono essere condizioni che restituiscono come risultato vero o falso. Gli operatori disponibili per tali confronti sono: <,>,<=,>=,==, ~=,&,|, ~
for k = 1:step:n operazioni, end Il ciclo esegue operazioni separate da virgole incrementando la variabile k da uno a n con il passo indicato da step.
While condizione operazioni; end Il ciclo esegue operazioni fino a quando la condizione verificata.
Grafici(1)
La funzione plot crea grafici bidimensionali;riceve in ingresso i due vettori
della stessa lunghezza e stampa i punti corrispondenti alle coordinate fornite dai due vettori. Ad esempio se si hanno due vettori x e y, il grafico corrispondente si ottiene come: plot(x,y);
Per tracciare il grafico di una qualsiasi funzione, perci necessario crearsi un
opportuno vettore da usare come ascisse, passarlo alla funzione per ricavare il vettore delle ordinate, ed usare la funzione plot sui due vettori cos ottenuti. Ad esempio per tracciare la funzione sin(x) tra -4 e +4 si pu usare la serie di comandi:
x = -4:0.01:4; y = sin(x); plot(x,y);
Grafici(2)
Per creare grafici di colori diversi o usando caratteri diversi dal punto
si pu specificare dopo le coordinate una stringa di due elementi. Il primo il colore del grafico, il secondo il simbolo usato per contrassegnare i punti. Ad esempio plot(x,y,g+); crea un grafico in verde usando dei + al posto dei punti. Questa opzione pu essere usata nei casi dei grafici sovrapposti da stampare(se la stampante a disposizione non a colori e se non si cambia il tipo di simbolo, le differenze non sono evidenti).
Grafici(3)
Altri comandi sono: -
grid: sovrappone al grafico un grigliato title: aggiunge un titolo al disegno xlabel: aggiunge una leggenda per lasse x ylabel: aggiunge una leggenda per lasse y axis: riscalagli assi del grafico clf: cancella il grafico corrente
Il comando figure crea una nuova finestra grafica in cui far comparire il
Grafici(4)
Per visualizzare pi grafici sulla stessa schermata si pu usare la funzione
subplot. La funzione vuole tre parametri: il primo indica in quante parti verticali dividere lo schermo, il secondo in quante parti orizzontali, il terzo in quale parte eseguire il plot successivo. subplot(2,1,1),plot(funz1); subplot(2,1,2),plot(funz2); Creiamo in tal modo 2 finestre divise da una linea orizzontale, e visualizza in quella alta il grafico di funzione1, e in quella bassa di funzione2. Il comando hold on permette di sovrapporre 2 o pi grafici Il comando hold off elimina tale possibilit(situazione standard)
Funzioni in Matlab(1)
In MATLAB possibile creare nuove funzioni.
Basta creare il file con estensione.m e nome del file uguale a quello della funzione desiderata. La prima riga del file deve contenere il nome della funzione e gli argomenti di ingresso e di uscita. Ad esempio: function z = funzione1(a,b) Oppure function [x y] = funzione2(a,b) Risulta che funzione1 e funzione2 sono nomi di funzioni;a e b sono argomenti dingresso; x ,y e z sono argomenti duscita.
Funzioni in Matlab(2)
da quelle dellambiente chiamante. E possibile utilizzare anche variabili globali, a patto che vengano definite come tali sia nellambiente chiamante che nella funzione, utilizzando il comando global seguito dai nomi delle variabili, separati da spazi: global f g h
Formati di unimmagine(1)
TheImage ProcessingToolboxdefinesfour basic types ofimages:
Binary: Logical array containing only 0s and 1s, interpreted as black and white, respectively. Also known as a bilevel image. Indexed: Array of class logical, uint8, uint16, single, or double whose pixel values are direct indices into a colormap. The colormap is an m-by-3 array of class double. Also known as a pseudocolor image. Grayscale: Array of class uint8, uint16, int16, single, or double whose pixel values specify intensity values. Also known as a intensity image Truecolor: m-by-n-by-3 array of class uint8, uint16, single, or double whose pixel values specify intensity values. Also known as an RGB image.
Formati di unimmagine(2)
Formati di unimmagine(3)
Converting Between Image Types:
dither : Create a binary image from a a grayscale image by dithering or create an indexed image image from a truecolor image by dithering gray2ind : Create an indexed image from a grayscale image grayslice Create an indexed image from a grayscale image by image by thresholding im2bw : Create a a binary image from a grayscale image, indexed image, or truecolor image, based on a luminance on threshold ind2gray : Create a grayscale image from an indexed image ind2rgb : Create a truecolor image from an indexed image image mat2gray : Create a a grayscale image from data in a matrix, by scaling the data
Lettura di unimmagine
imread = Read image from graphics file. usage: >> A = imread(FILENAME,FMT)
where: FILENAME una stringa (ex. img01.jpg) contenente il nome del file da leggere. FMT una stringa contenente la sigla del formato dellimmagine. Principali formati supportati:JPG,TIF,BMP,...
Lettura di unimmagine
imread = Read image from graphics file. usage: >> A = imread(FILENAME,FMT) rgb2gray = Convert a color image in grayscale.
close all % chiude tutte le finestre clear all % pulisce la memoria di Matlab clc %pulisce il command window
figure, I = imread('lena.jpg'); % Apre una nuova figura eleggo l'immagine imshow(I); I_gray = rgb2gray(I); figure,imshow(I_gray);title('Img a toni di grigio');
Not logico
Original = imread('prova1_bnrect.jpg'); Original = rgb2gray(Original); %thresholding [righe colonne]=size(Original); Original_binarizzata =Original; for i=1:righe for j=1:colonne if(Original_binarizzata(i,j)>200) Original_binarizzata(i,j) = 1; else Original_binarizzata(i,j)=0; end end end figure,imshow(Original);title('Img originale'); figure,imshow(Original_binarizzata);title('Img binarizzata'); Not_Img = not(Original_binarizzata); figure,imshow(Not_Img);title('Img Not'); And_Image = Original_binarizzata & Not_Img; figure,imshow(And_Image);title('Img AND'); OR_Image = or(Original_binarizzata,Not_Img); figure,imshow(OR_Image);title('Img OR');
Thresholding statico
clc clear all close all Original=imread('lena.jpg'); imshow(Original); Original=rgb2gray(Original); figure,imshow(Original); Original_binarizzata = Original;Original_binarizzata2 = Original; [righe colonne]=size(Original); for i=1:righe for j=1:colonne if(Original_binarizzata(i,j)>200) Original_binarizzata(i,j) = 255; else Original_binarizzata(i,j)=0; end end end figure,imshow(Original_binarizzata);title('binarizz. soglia=200');
for i=1:righe for j=1:colonne if(Original_binarizzata2(i,j)>100) Original_binarizzata2(i,j) = 255; else Original_binarizzata2(i,j)=0; end end end figure,imshow(Original_binarizzata2);title('binarizz. soglia=100');
Negativo di un Immagine
for i=1:righe for j=1:colonne New_Original_binarizzata(i,j) = 255 - 1 - Original_binarizzata(i,j); end end figure,imshow(New_Original_binarizzata);title('NEGATIVO');
fspecial
fspecial = Permette di creare dei particolari filtri bidimensionali
'average' averaging filter 'disk' circular averaging filter
'gaussian' Gaussian lowpass filter 'laplacian' filter approximating the 2-D Laplacian operator 'log' Laplacian of Gaussian filter
H = FSPECIAL('prewitt') returns 3-by-3 filter that emphasizes horizontal edges by approximating a vertical gradient. If you need to emphasize vertical edges, transpose the filter H: H'. [1 1 1;0 0 0;-1 -1 -1].
fspecial
function [ImmagineFiltrata] = filtro_gaussiano(Immagine, kernel_size) h = fspecial('gaussian', [ kernel_size kernel_size]); ImmagineFiltrata = filter2(h,Immagine); function [ImmagineFiltrata] = filtro_laplaciano(Immagine) h = fspecial('laplacian'); ImmagineFiltrata = filter2(h,Immagine); function [ImmagineFiltrata] = filtro_media(Immagine, kernel_size) h = fspecial('average', [ kernel_size kernel_size ]); ImmagineFiltrata = filter2(h,Immagine); function [ImmagineFiltrata] = filtro_mediano(Immagine, m, n) ImmagineFiltrata = medfilt2(uint8(Immagine),[m n]); function [ImmagineFiltrata] = filtro_prewitt(Immagine) h = fspecial('prewitt'); ImmagineFiltrata = filter2(h,Immagine); function [ImmagineFiltrata] = filtro_sobel(Immagine) h = fspecial('sobel'); ImmagineFiltrata = filter2(h + h',Immagine);
Imnoise
imnoise = Add noise to image usage: >> J = IMNOISE(I,TYPE,...) vari tipi di rumore: 'gaussian
'localvar'
Imfilter
imfilter = Permette di filtrare unimmagine multidimensionale
IMFILTER N-D filtering of multidimensional images. B = IMFILTER(A,H) filters the multidimensional array A with the multidimensional filter H. A can be logical or it can be a nonsparse numeric array of any class and dimension. The result, B, has the same size and class as A.
Rumore Casuale
clc clear all close all img = imread('lena.jpg'); img = rgb2gray(img); img = imresize(img,[255 255]); img_rumore_casuale =uint8(rand(size(img))*255);%generiamo una matrice i cui valori sono compresi tra 0 ed 1 contenente solo rumore i quali sono equiprobabili e equidistribuiti imshow(img);title('Immagine iniziale'); figure,imshow(img_rumore_casuale);title('Solo rumore casuale'); somma = img + img_rumore_casuale;%sommiamo allimg il rumore generato figure,imshow(somma);title('Immagine rumorosa');
Rumore Gaussiano
clc clear all close all img = imread('lena.jpg'); img = rgb2gray(img); h = fspecial('gaussian', [ 3 3]); Immagine_rumorosa = imnoise(img, 'gaussian'); ImmagineFiltrata = filter2(h,img); ImmagineFiltrata = uint8(ImmagineFiltrata); imshow(img);title('Immagine originale'); figure,imshow(Immagine_rumorosa);title('Immagine Rumorosa'); figure,imshow(ImmagineFiltrata);title('Filtrata');
Mean Filter
I = imread('lena.jpg'); h = ones(7,7)/49; I3 = imfilter(I,h); %IMFILTER Multidimensional image filtering. imshow(I); title('Immagine Originale 2'); figure; imshow(I3); title('Immagine Filtrata 2'); oppure usando il comando fspecial close all clc clear all I = imread('lena.jpg'); % I2=rgb2gray(I); Filtro_m=fspecial('average',[7 7]); %Le dimensioni di default sono 3x3. %Limmagine poi mediata con il comando seguente: I_mediata=imfilter(I,Filtro_m); imshow(I);title('Img originale'); figure,imshow(I_mediata);
Mean Filter(fspecial)
H = fspecial('average',HSIZE) returns an averaging filter H of size HSIZE. HSIZE can be a vector specifying the number of rows and columns in H or a scalar, in which case H is a square matrix. The default HSIZE is [3 3]. H = fspecial('disk',RADIUS) returns a circular averaging filter (pillbox) within the square matrix of side 2*RADIUS+1. The default RADIUS is 5.
Median Filter
medfilt= Esegue un filtraggio MEDIANO bi-dimensionale
close all clc clear all I = imread('lena.jpg'); I2=rgb2gray(I); J = imnoise(I2,'salt & pepper', 0.02);%Introduce un disturbo impulsivo nellimmagine Filtrata = medfilt2 (J,[3 3]); imshow(I2);title('Img originale'); figure,imshow(J);title('Img rumorosa'); figure,imshow(Filtrata);title('Img filtrata');
Sharpening Filter
clc close all clear all I1 = imread('lena.jpg'); I1 = rgb2gray(I1); I1=imresize(I1,[255,255]); h=[0 -1 0;-1 5 -1;0 -1 0]; %sharpening filter I_filtrata=imfilter(I1,h); imshow(I1);title('Img original'); figure,imshow(I_filtrata), title('Immagine Filtrata');
Sharpening Filter(High-boost)
clc close all clear all I1 = imread('lena.jpg'); I1 = rgb2gray(I1); I1=imresize(I1,[255,255]); A1 = 1; A2 = 1.1; A3 = 1.15; A4 = 1.2; W1 = 9 * A1-1; W2 = 9 * A2-1; W3 = 9 * A3-1; W4 = 9 * A4-1; h1=[-1 -1 -1;-1 W1 -1 ;-1 -1 -1]; %High boost filter W=1 h2=[-1 -1 -1;-1 W2 -1 ;-1 -1 -1]; %High boost filter W=1.1 h3=[-1 -1 -1;-1 W3 -1;-1 -1 -1]; %High boost filter W=1.15 h4=[-1 -1 -1;-1 W4 -1 ;-1 -1 -1]; %High boost filter W=1.2 I_filtrata1=imfilter(I1,h1); I_filtrata2=imfilter(I1,h2); I_filtrata3=imfilter(I1,h3); I_filtrata4=imfilter(I1,h4); imshow(I1);title('Img original'); figure,imshow(I_filtrata1), title('Immagine Filtrata W=1'); figure,imshow(I_filtrata2), title('Immagine Filtrata W=1.1'); figure,imshow(I_filtrata3), title('Immagine Filtrata W=1.15'); figure,imshow(I_filtrata4), title('Immagine Filtrata W=1.2');
Sharpening Filter(High-boost)
I_filtrata1=imfilter(I1,h1); I_filtrata2=imfilter(I1,h2); I_filtrata3=imfilter(I1,h3); I_filtrata4=imfilter(I1,h4); imshow(I1);title('Img original'); figure,imshow(I_filtrata1), title('Running difference 1'); figure,imshow(I_filtrata2), title('Running difference2'); figure,imshow(I_filtrata3), title('Robert1'); figure,imshow(I_filtrata4), title('Robert2');
Roberts
Il gradiente(Operatori di Prewitt)
clc close all clear all I1 = imread('lena.jpg'); I1 = rgb2gray(I1); I1=imresize(I1,[255,255]); IN ALTERNATIVA SI PUO USARE LA SEGUENTE FUNZIONE MATLAB: BW = edge(I,'filter',thresh,direction); Dove i filtri a disposizione sono: 1)Sobel 2)Prewitt 3)Roberts 4)Log 5)Zerocross 6)Canny
h_0=[-1 0 1;-1 0 1;-1 0 1]; %Prewitt 0 h_45=[0 -1 -1;1 0 -1;1 1 0]; %Prewitt 45 h_90=[-1 -1 -1;0 0 0;1 1 1]; %Prewitt 90 h_135=[-1 -1 0;-1 0 1;0 1 1 ]; %Prewitt 135 I_filtrata1=imfilter(I1,h_0); I_filtrata2=imfilter(I1,h_45); I_filtrata3=imfilter(I1,h_90); I_filtrata4=imfilter(I1,h_135); imshow(I1);title('Img original'); figure,imshow(I_filtrata1), title('Prewitt 0'); figure,imshow(I_filtrata2), title('Prewitt 45'); figure,imshow(I_filtrata3), title('Prewitt 90'); figure,imshow(I_filtrata4), title('Prewitt 135');
Il gradiente(Operatori di Prewitt)
Il gradiente(Operatori di Sobel)
clc close all clear all I1 = imread('lena.jpg'); I1 = rgb2gray(I1); I1=imresize(I1,[255,255]);
%Sobel1 %Sobel2
Il Laplaciano
clc close all clear all I1 = imread('lena.jpg'); I1 = rgb2gray(I1); I1=imresize(I1,[255,255]);
Laplace1=[0 1 0;1 -4 1;0 1 0]; Laplace2=[1 1 1;1 -8 1;1 1 1]; I_filtrata1=imfilter(I1,Laplace1); I_filtrata2=imfilter(I1,Laplace2);
Il Laplaciano(fspecial)
H = fspecial('laplacian',ALPHA) returns a 3-by-3 filter approximating the shape of the two-dimensional Laplacian operator. The parameter ALPHA controls the shape of the Laplacian and must be in the range 0.0 to 1.0. The default ALPHA is 0.2.
Histogram equalization
Listogramma un grafico che mostra la distribuzione delle intensit in un immagine. La funzione imhist crea un grafico nelle cui ascisse ci sono una serie di valori equispaziati (in genere da 0 a 255, corrispondenti alle intensit dei pixel in unimmagine a toni di grigio) e sulle ordinate vi il numero di pixel di quellintensit presenti nellimmagine.
Histogram equalization
histeq = Enhance contrast using histogram equalization
Tramite histeq possibile definire uno specifico istogramma cui si vuole adattare limmagine attualmente in memoria.
Operatori Morfologici(open)
clear, close all I = imread('lena.jpg'); I=imresize(I,[180 180]); imshow(I); background = imopen(I, strel('disk', 15)); imshow(I);title('immagine originale'); figure,imshow(background);title('background');
clc close all clear all I = imread('lena.jpg'); figure,imshow(I); J = imrotate(I,35,'bilinear'); figure, imshow(J)
clc close all clear all I = imread('lena.jpg'); figure,imshow(I); J = imcrop(I); figure, imshow(J)
Line detection
Si considerano le seguenti maschere in base alla direzione da individuare:
La prima maschera risponde in maniera forte alle linee orizzontali ( punti pi spessi). Per linee orizzontali spesse un pixel su sfondo uniforme si pu usare la prima maschera, infatti R massimo quando la linea combacia con la riga centrale della tabella.
Line Detection
clc clear all close all img = imread('libri_noise.bmp'); img_gray = rgb2gray(img); h_oriz = [1 1 1;0 0 0;-1 -1 -1]; img_filtrata_oriz = conv2(img_gray,h_oriz); h_vert = [1 0 -1;1 0 -1;1 0 -1]; img_filtrata_vert = conv2(img_gray,h_vert); imshow(img_gray);title('Immagine originale'); figure,imshow(img_filtrata_oriz);title('Detection delle linee orizzontali'); figure,imshow(img_filtrata_vert);title('Detection delle linee verticali');
Edge detection
La funzione in MATLAB per ledge detection la seguente: BW = edge(I,'filter',thresh,direction); Dove i filtri a disposizione sono: 1)Sobel 2)Prewitt 3)Roberts 4)Log 5)Zerocross 6)Canny
Edge detection
clc clear all close all img = imread('libri_noise.bmp'); img_gray = rgb2gray(img); B1 = edge(img_gray,'sobel'); B2 = edge(img_gray,'prewitt'); B3 = edge(img_gray,'log'); B4 = edge(img_gray,'zerocross'); B5 = edge(img_gray,'canny'); figure(1),imshow(img_gray);xlabel('Img originale'); figure(2),imshow(B1);xlabel('sobel'); figure(3),imshow(B2);xlabel('prewitt'); figure(4),imshow(B3);xlabel('log'); figure(5),imshow(B4);xlabel('zerocross'); figure(6),imshow(B5);xlabel('canny');
Edge detection