77
Esercitazione in Matlab Intelligenza Artificiale 06 – Dicembre – 2007 Ing. G. Scarciofalo

Border Detection

Embed Size (px)

Citation preview

Page 1: Border Detection

Esercitazione in MatlabIntelligenza Artificiale

06 – Dicembre – 2007Ing. G. Scarciofalo

Page 2: Border Detection

Introduzione a Matlab

I fondamenti

&

L’Image Processing

A cura di:

SPAMPINATO CONCETTO

GIACOMO SCARCIOFALOhttp://campusone.ing.unict.it

Page 3: Border Detection

Informazioni:

Email: [email protected]@diit.unict.it

Sito web: www.campusone.ing.unict.it

Orario di ricevimento: Giovedì 16:00-18:00

Studio: Dip. di Ing. Informatica e delleTelecomunicazioni, stanza Prof.A.Farotel. 095-7382372

Page 4: Border Detection

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 all’analisi e alla soluzione di problemi di controllo e all’image processing.

Page 5: Border Detection

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 l’utente 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.

Page 6: Border Detection

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 stessacategoria; ad esempio per sapere quale sono le funzioni per l’analisi ed il controllo dei sistemi dinamici basta digitare:help controlPer sapere quali sono le categorie dei toolbox disponibili basta digitare semplicementehelp

Page 7: Border Detection

Files in Matlab

I files interpretati dal programma sono file di testo ASCII conestensione.m; sono generati con un text editor e eseguiti inMATLAB semplicemente digitandone il nome sulla linea di comando(senza senza estensione estensione!).E’ possibile inserire dei commenti al loro interno precedendo ognilinea 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

Page 8: Border Detection

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 dell’istruzione.

Esempio: var1 = 6;

Page 9: Border Detection

Nozioni generali(1)Alcuni costrutti in MATLAB permettono la concatenazione di diverse istruzioni;queste vanno separate dalla virgola;

Esempio: if flag ==0istruzioni 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.

Page 10: Border Detection

Nozioni generali(2)Per visualizzare il contenuto di una variabile è sufficiente digitare il nome senza il punto e virgola sulla linea di comando;

Tutti i calcoli effettuati in MATLAB sono eseguiti in doppiaprecisione, ma si possono visualizzare in formato diverso usando i comandi:

format short virgola fissa con 4 decimaliformat long virgola fissa con 15 decimali………….. ……………………………..

Il risultato dell’ultima operazione è contenuto nella variabile ans.

Page 11: Border Detection

Comandi di uso generalewho: elenco delle variabili definite in memoria; su tutte le variabili in whos: informazioni su tutte le variabili in memoria;clear: cancella tutte le variabili in memoria o una in particolare sespecificata;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 nell’area di lavoro(estensione.m) e dei file di dati che sono stati salvati(estensione.mat).

Page 12: Border Detection

Operatori scalari

Gli operatori disponibili sono:+,-,*,/,^,sin,cos,tanasin,acos,atanexp,log(naturale),log10(in base 10)abs,sqrt,sign

Page 13: Border Detection

Matrici ed il loro operatori(1)

L’inserimento di un vettore o di una matrice in generale viene effettuato tra parentesi quadre, separando gli elementi delle righe con spazi o virgole, e le diverse righe con punti e virgola, oppure andando a capo ad ogni nuova riga.

Es. di vett riga: x = [1,2,3];Es. di vett colonna: y = [1;4;7];Es. di matrice A = [1 2 3;4 5 6;7 8 9];oppure A = [1 2 3

4 5 67 8 9]

Page 14: Border Detection

Matrici ed il loro operatori(2)

Per fare riferimento agli elementi di una matrice A:L’elemento a_mn è indirizzato come A(m,n);es. A(2,3) = 6;La riga m-esima è indirizzata come A(m,:), dove tutte le colonne sono indicate con i due punti;

La colonna n-esima è indirizzata come A(:,n), dove tutte le righe sono indicate con i due punti;

Page 15: Border Detection

Matrici ed il loro operatori(3)

Gli operatori applicabili a matrici sono:- + - * ^- / Divisione a destra- \Divisione a sinistra- ‘ Trasposta

Attenzione! Ricordarsi sempre che quando si fanno operazioni tra matrici è importante l’ordine dei fattori.

Page 16: Border Detection

Matrici ed il loro operatori(4)

Altre funzioni operanti essenzialmente sui vettori riga o colonna sono:- 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);

Page 17: Border Detection

Matrici ed il loro operatori(5)

Altre funzioni operanti essenzialmente matrici soo:- 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.

Page 18: Border Detection

Matrici ed il loro operatori(6)

Esistono poi varie funzioni predefinite per la creazione di matrici:- 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.

Page 19: Border Detection

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;

elseoperazioni3;

end;

Condizione1,2 devono essere condizioni che restituiscono come risultato vero o falso. Gli operatori disponibili per tali confronti sono:

<,>,<=,>=,==, ~=,&,|, ~

Page 20: Border Detection

Istruzioni per i cicli

I cicli si possono fare con due diversi costrutti:for k = 1:step:noperazioni,

endIl ciclo esegue operazioni separate da virgole incrementando la variabile k

da uno a n con il passo indicato da step.

While condizioneoperazioni;

endIl ciclo esegue operazioni fino a quando la condizione è verificata.

Page 21: Border Detection

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

Page 22: Border Detection

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…).

Page 23: Border Detection

Grafici(3)Altri comandi sono:

- grid: sovrappone al grafico un grigliato- title: aggiunge un titolo al disegno- xlabel: aggiunge una leggenda per l’asse x- ylabel: aggiunge una leggenda per l’asse y- axis: riscalagli assi del grafico- clf: cancella il grafico corrente

Il comando figure crea una nuova finestra grafica in cui far comparire il disegno; per spostarsi sull’n-esima finestra grafica, basta digitare figure(n)

Page 24: Border Detection

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ù graficiIl comando hold off elimina tale possibilità(situazione standard)

Page 25: Border Detection

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 d’ingresso; x ,y e z sono argomenti d’uscita.

Page 26: Border Detection

Funzioni in Matlab(2)

Le variabili utilizzate in una funzione sono locali e quindi indipendenti da quelle dell’ambiente chiamante.Eì possibile utilizzare anche variabili globali, a patto che vengano definite come tali sia nell’ambiente chiamante che nella funzione, utilizzando il comando global seguito dai nomi delle variabili, separati da spazi:

global f g h

Page 27: Border Detection

Per gli Esercizi:

Si devono avere:1) Matlab2) Immagini esercitazione scaricabili da:

http://campusone.ing.unict.it

Page 28: Border Detection

Formati di un’immagine(1)

TheImage ProcessingToolboxdefinesfour basic types ofimages:

– Binary: Logical array containing only 0’s and 1’s, interpreted asblack 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 doublewhose pixel values specify intensity values. Also known as a intensity image

– Truecolor: m-by-n-by-3 array of class uint8, uint16, single, or doublewhose pixel values specify intensity values. Also known as an RGB image.

Page 29: Border Detection

Formati di un’immagine(2)

Page 30: Border Detection

Formati di un’immagine(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 graysliceCreate 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

Page 31: Border Detection

Lettura di un’immagine

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 dell’immagine.Principali formati supportati:JPG,TIF,BMP,...

Page 32: Border Detection

Lettura di un’immagineimread = “Read image from graphics file”.

usage: >> A = imread(FILENAME,FMT)

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

rgb2gray = “Convert a color image in grayscale”.

Page 33: Border Detection

Somma di due Immagini

I = imread('rice.png');J = imread('cameraman.tif');

Somma1 = imadd(I,J);figure,

imshow(Somma1);title('Somma1');Somma2 = I + J;

figure, imshow(Somma2);title('Somma2');

Page 34: Border Detection

Differenza di due Immagini

I = imread('rice.png');background = imopen(I,strel('disk',15));Ip = imsubtract(I,background);imshow(I), figure, imshow(Ip);

Page 35: Border Detection

Not logicoOriginal = imread('prova1_bnrect.jpg');Original = rgb2gray(Original);%thresholding[righe colonne]=size(Original);Original_binarizzata =Original;for i=1:righe

for j=1:colonneif(Original_binarizzata(i,j)>200)

Original_binarizzata(i,j) = 1;else

Original_binarizzata(i,j)=0;end

endendfigure,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');

Page 36: Border Detection

And logico tra Immaginiclcclose allclear allI1 = imread('Immagine1.jpg');I2 = imread('Immagine2.jpg');I1 = rgb2gray(I1);I2 = rgb2gray(I2);I1=imresize(I1,[255,255]);I2=imresize(I2,[255,255]);%thresholding[righe colonne]=size(I1);Original_binarizzata1 =I1;Original_binarizzata2 =I2;for i=1:righe

for j=1:colonneif(Original_binarizzata1(i,j)>200)

Original_binarizzata1(i,j) = 255;else

Original_binarizzata1(i,j)=0;end

endendfor i=1:righe

for j=1:colonneif(Original_binarizzata2(i,j)>200)

Original_binarizzata2(i,j) = 255;else

Original_binarizzata2(i,j)=0;end

endendfigure,imshow(I1);title('Img originale1');figure,imshow(Original_binarizzata1);title('Img binarizzata1');figure,imshow(I1);title('Img originale2');figure,imshow(Original_binarizzata1);title('Img binarizzata2');And_Image = Original_binarizzata1 & Original_binarizzata2;figure,imshow(And_Image);title('Img AND');OR_Image = or(Original_binarizzata1,Original_binarizzata2);figure,imshow(OR_Image);title('Img OR');

Page 37: Border Detection

And logico tra Immagini

Page 38: Border Detection

Thresholding staticoclcclear allclose allOriginal=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:colonneif(Original_binarizzata(i,j)>200)

Original_binarizzata(i,j) = 255;else

Original_binarizzata(i,j)=0;end

endendfigure,imshow(Original_binarizzata);title('binarizz. soglia=200');

for i=1:righefor j=1:colonne

if(Original_binarizzata2(i,j)>100)Original_binarizzata2(i,j) = 255;

elseOriginal_binarizzata2(i,j)=0;

endend

endfigure,imshow(Original_binarizzata2);title('binarizz. soglia=100');

Page 39: Border Detection

Negativo di un Immaginefor i=1:righe

for j=1:colonneNew_Original_binarizzata(i,j) = 255 - 1 - Original_binarizzata(i,j);

endendfigure,imshow(New_Original_binarizzata);title('NEGATIVO');

Page 40: Border Detection

fspecial

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 = “ Permette di creare dei particolari filtri bi-dimensionali”

'average' averaging filter

'disk' circular averaging filter

'gaussian' Gaussian lowpass filter

'laplacian' filter approximating the 2-D Laplacian operator

'log' Laplacian of Gaussian filter

Page 41: Border Detection

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

Page 42: Border Detection

Imnoise

imnoise = “Add noise to image ”

usage: >> J = IMNOISE(I,TYPE,...)vari tipi di rumore: 'gaussian‘ Rumore bianco gaussiano a

media e varianza costanti

'localvar' La varianza dipende dall’intensità

'salt & pepper' Rumore sale e pepe

'speckle' Rumore moltiplicativo

Page 43: Border Detection

Imfilter

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.

imfilter = “ Permette di filtrare un’immagine multidimensionale”

Page 44: Border Detection

Rumore Casualeclcclear allclose 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 equidistribuitiimshow(img);title('Immagine iniziale');figure,imshow(img_rumore_casuale);title('Solo rumore casuale');somma = img + img_rumore_casuale;%sommiamo all’img il rumore generatofigure,imshow(somma);title('Immagine rumorosa');

Page 45: Border Detection

Rumore Gaussiano

clcclear allclose allimg = 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');

Page 46: Border Detection

Rumore Salt & Pepper

clcclear allclose allimg = imread('lena.jpg');img = rgb2gray(img);h = fspecial('gaussian', [ 3 3]);Immagine_rumorosa = imnoise(img,'salt & pepper', 0.02);ImmagineFiltrata = filter2(h,img);ImmagineFiltrata = uint8(ImmagineFiltrata);imshow(img);title('Immagine originale');figure,imshow(Immagine_rumorosa);title('Immagine Rumorosa');figure,imshow(ImmagineFiltrata);title('Filtrata');

Page 47: Border Detection

Mean FilterI = imread('lena.jpg');h = ones(7,7)/49;I3 = imfilter(I,h); %IMFILTERMultidimensional image filtering.imshow(I); title('Immagine Originale 2');figure; imshow(I3); title('Immagine Filtrata 2');

oppure usando il comando‘fspecial’

close allclcclear allI = imread('lena.jpg');% I2=rgb2gray(I);Filtro_m=fspecial('average',[7 7]);%Le dimensioni di default sono 3x3.%L’immagine è poi mediata con il comando seguente:I_mediata=imfilter(I,Filtro_m);imshow(I);title('Img originale');figure,imshow(I_mediata);

Page 48: Border Detection

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.

Page 49: Border Detection

Median Filter

close allclcclear allI = imread('lena.jpg');I2=rgb2gray(I);J = imnoise(I2,'salt & pepper', 0.02);%Introduce un disturbo impulsivo nell’immagineFiltrata = medfilt2 (J,[3 3]);imshow(I2);title('Img originale');figure,imshow(J);title('Img rumorosa');figure,imshow(Filtrata);title('Img filtrata');

medfilt= “Esegue un filtraggio MEDIANO bi-dimensionale”

Page 50: Border Detection

Filtro Mediano Vs Filtro Mediaclose allclcclear all

OriginalImg = imread('lena.jpg');%caricamento dell’immagine non rumorosaOriginalImg = rgb2gray(OriginalImg);NoisyImg = imnoise (OriginalImg,'salt & pepper',0.5);%deterioramentodell’immagineFilteredImg = medfilt2 (NoisyImg,[3 3]);%immagine filtrata con il Mediano

MeanFilter=fspecial('average',[3 3]);%filtro medio 3 x 3FilteredImgMean=imfilter(NoisyImg,MeanFilter);%immagine filtrata con il filtro medioimshow(OriginalImg);title('img originale');%originalefigure;imshow(NoisyImg);title('img romorosa');%rumorosafigure;imshow(FilteredImg);title('img filtrata con il filtro mediano');%medianofigure;imshow(FilteredImgMean);title('img filtrata con il filtro medio');%medio

Page 51: Border Detection

Filtro Mediano Vs Filtro Media

Page 52: Border Detection

Filtro di max e minclcclose allclear allI = imread('lena.jpg');I = imresize(I,[255,255]);%ridimensionamento dell'immagineI = rgb2gray(I);[righe colonne] = size(I);

for i=2:righe - 1for j=2:colonne - 1

x = I(i,j);as = I(i-1,j-1);ac = I(i-1,j);ad = I(i-1,j+1);cs = I(i,j-1);cd = I(i,j+1);bs = I(i+1,j-1);bc = I(i+1,j);bd = I(i+1,j+1);vett = [x as ac ad cs cd bs bc bd];%vett = double(vett);%w = tabulate(vett);massimo_vett = max(vett);minimo_vett = min(vett);%w2 = w(:,2);%[massimo indicemax] = max(w2);%prendo il valore più piccolo tra i massimi%I_modificata3(i,j) = indicemax; I_modificata(i,j) = massimo_vett; I_modificata2(i,j) = minimo_vett;

endend

figure,imshow(I);title('Img original');figure,imshow(I_modificata);title('immagine originale filtrata con il filtro massimo cn il valore max');figure,imshow(I_modificata2);title('immagine originale filtrata con il filtro minimo con il valore min');

Page 53: Border Detection

Filtro di max e min

Page 54: Border Detection

Sharpening Filter

clcclose allclear allI1 = imread('lena.jpg');I1 = rgb2gray(I1);I1=imresize(I1,[255,255]);

h=[0 -1 0;-1 5 -1;0 -1 0]; %sharpening filterI_filtrata=imfilter(I1,h);imshow(I1);title('Img original');figure,imshow(I_filtrata), title('Immagine Filtrata');

Page 55: Border Detection

Sharpening Filter(High-boost)clcclose allclear allI1 = 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=1h2=[-1 -1 -1;-1 W2 -1 ;-1 -1 -1]; %High boost filter W=1.1h3=[-1 -1 -1;-1 W3 -1;-1 -1 -1]; %High boost filter W=1.15h4=[-1 -1 -1;-1 W4 -1 ;-1 -1 -1]; %High boost filter W=1.2I_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');

Page 56: Border Detection

Sharpening Filter(High-boost)

Page 57: Border Detection

Filtri Derivativi del primo ordine

clcclose allclear allI1 = imread('lena.jpg');I1 = rgb2gray(I1);I1=imresize(I1,[255,255]);

h1=[0 0 0;0 1 0 ;0 -1 0]; %Running difference1h2=[0 0 0;0 1 -1 ;0 0 0]; %Running difference2h3=[0 0 0;0 1 0;0 0 -1]; %Robert1h4=[0 0 0;0 0 1;0 -1 0]; %Robert2

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

Page 58: Border Detection

Filtri Derivativi del primo ordine

Roberts

Runningdifference

Page 59: Border Detection

Il gradiente(Operatori di Prewitt)

clcclose allclear allI1 = imread('lena.jpg');I1 = rgb2gray(I1);I1=imresize(I1,[255,255]);

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

IN ALTERNATIVA SI PUO’ USARE LA SEGUENTE FUNZIONE MATLAB:

BW = edge(I,'filter',thresh,direction);

Dove i filtri a disposizione sono:

1)Sobel2)Prewitt3)Roberts4)Log5)Zerocross6)Canny

Page 60: Border Detection

Il gradiente(Operatori di Prewitt)

Page 61: Border Detection

Il gradiente(Operatori di Sobel)clcclose allclear allI1 = imread('lena.jpg');I1 = rgb2gray(I1);I1=imresize(I1,[255,255]);

h1=[-1 -2 -1;0 0 0;1 2 1]; %Sobel1h2=[-1 0 1;-2 0 2;-1 0 1]; %Sobel2

I_filtrata1=imfilter(I1,h1);I_filtrata2=imfilter(I1,h2);imshow(I1);title('Img original');figure,imshow(I_filtrata1), title('Sobel1');figure,imshow(I_filtrata2), title('Sobel2');

Page 62: Border Detection

Il gradiente(Operatori di Sobel) fspecial

H = FSPECIAL('sobel') returns 3-by-3 filter that emphasizes horizontal edges utilizing the smoothing effect by approximating a vertical gradient. If you need to emphasize vertical edges, transposethe filter H: H'.

[1 2 1;0 0 0;-1 -2 -1].

Page 63: Border Detection

Il Laplacianoclcclose allclear allI1 = imread('lena.jpg');I1 = rgb2gray(I1);I1=imresize(I1,[255,255]);

Laplace1=[0 1 0;1 -4 1;0 1 0]; %Laplace1 filterLaplace2=[1 1 1;1 -8 1;1 1 1]; %Laplace2 filter

I_filtrata1=imfilter(I1,Laplace1);I_filtrata2=imfilter(I1,Laplace2);

imshow(I1);title('Img original');figure,imshow(I_filtrata1), title('Laplace1');figure,imshow(I_filtrata2), title('Laplace2');

Page 64: Border Detection

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.

Page 65: Border Detection

Histogram equalizationclcclear allclose allImg = imread('lena.jpg');imshow(Img);title('Immagine originale');Img = rgb2gray(Img);figure,imshow(Img);title('Img a toni di grigio');figure,imhist(Img);title('Istogramma dell''immagine iniziale');% Img = double(Img);Img_equalizzata = histeq(Img);figure,imshow(Img_equalizzata);title('Img equalizzata');figure,imhist(Img_equalizzata);title('Istogramma dell''immagine equalizzata');

L’istogramma è 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 un’immagine a toni di grigio) e sulle ordinate vi è il numero di pixel di quell’intensità presenti nell’immagine.

imhist = “Display histogram of image data”

Page 66: Border Detection

Histogram equalization

Tramite histeq è possibile definire uno specifico istogramma cui si vuole adattare l’immagine attualmente in memoria.

histeq = “Enhance contrast using histogram equalization”

Page 67: Border Detection

Aggiustamento del contrasto

imadjust = “Make intensity adjustement”Tramite imadjust è possibile definire un nuovo range sull’istogramma dell’ immagine desiderata, così da esaltare, ad esempio, il contrasto.

usage:>> J = IMADJUST(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT],GAMMA)

I valori di intensità compresi fra LOW_IN e HIGH_IN vengono rimappati così da stare tra LOW_OUT e HIGH_OUT.

Esempio: L’immagine del riso non ha valori tra 0 e 40. E’ possibile usare Imadjust per “spalmare” i valori a anche tra 0 e 40.

Attenzione: Le soglie tra [] vengono date in numeri tra 0 e 1. Equivalea dividere per 255.

Page 68: Border Detection

Aggiustamento del contrasto

J = IMADJUST(I) maps the values in intensity image I to new values in Jsuch that 1% of data is saturated at low and high intensities of I. Thisincreases the contrast of the output image J.

imadjust = “Make intensity adjustement”

Page 69: Border Detection

Operatori Morfologici(open)

clear, close allI = 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');

APERTURA = successione di un erosione e di un

espansione

Page 70: Border Detection

Ritocco di immagini - Resize

Di default, le immagini vengono visualizzate interamente nelle finestre Matlab, ma spesso esse sono troppo grandi per cui è necessario il loro ridimensionamento;Per fare ciò, si utilizza il comando sopra citato tramite il quale è possibilescegliere un fattore di scala o esplicitare interamente le dimensioni dell’immagineda visualizzare.

clcclose allclear allI = imread('lena.jpg');I = rgb2gray(I);imshow(I);I = imresize(I,[50 50]);figure,imshow(I);J = imresize(I,2);figure, imshow(J)

imresize = “resize image”

Page 71: Border Detection

Ritocco di immagini - Rotate

Per ruotare un’immagine si utilizza la funzione imrotate la quale accettaprincipalmente due parametri in ingresso, l’immagine da ruotare e l’angolo dirotazione in gradi. Possiamo specificare un valore positivo per ruotarel’immagine in senso orario, negativo per il senso antiorario. Vi sono due ulterioriparametri opzionali che permettono di specificare la dimensione dell’immagine in uscita ed il metodo di interpolazione.

clcclose allclear allI = imread('lena.jpg');figure,imshow(I);J = imrotate(I,35,'bilinear');figure, imshow(J)

imrotate = “Rotate image”

Page 72: Border Detection

Ritocco di immagini - imcrop

Per estrarre una porzione rettangolare di un’immagine si usa la funzione imcropla quale accetta principalmente due parametri in ingresso:l’immagine da cropparee le coordinate del rettangolo che conterrà l’area selezionata;se non si specificaquest’ultimo parametro si procederà ad un’estrazione interattiva;

clcclose allclear allI = imread('lena.jpg');figure,imshow(I);J = imcrop(I);figure, imshow(J)

imcrop = “Crop image”

Page 73: Border 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

Page 74: Border Detection

Line Detectionclcclear allclose allimg = 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');

Page 75: Border Detection

La funzione in MATLAB per l’edge detection è la seguente:

BW = edge(I,'filter',thresh,direction);

Dove i filtri a disposizione sono:

1)Sobel2)Prewitt3)Roberts4)Log5)Zerocross6)Canny

Edge detection

Page 76: Border Detection

clcclear allclose allimg = 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

Page 77: Border Detection

Edge detection