Elaborazione Digitale di Segnali e Immagini in MATLAB
1. Filtraggio Puntuale e Normalizzazione del Contrasto
Il seguente codice implementa una trasformazione lineare dei livelli di grigio per normalizzare l'istogramma di un'immagine.
1 % I: una matrice che rappresenta un'immagine a toni di grigio
2 % Inew: l'immagine dopo l'operazione di filtraggio puntuale
3 I = imread('cameraman.tif');
4 I = double(I);
5
6 r_max = max(I(:));
7 r_min = min(I(:));
8 a = 0;
9 b = 255;
10
11 LUT = [];
12 for i = 0:255
13 r = i;
14 if r <= r_max & r >= r_min
15 s = ((r - r_min) / (r_max - r_min)) * (b - a) + a;
16 else
17 s = r;
18 end
19 LUT(i + 1) = s;
20 end
21 Inew = uint8(LUT(I + 1));
22 figure, imshow(Inew);
2. Operazioni di Clipping tramite Look-Up Table (LUT)
In questo esempio, viene applicato un filtro che limita i valori di intensità dell'immagine tra un valore minimo a e un valore massimo b.
1 % I: una matrice che rappresenta un'immagine a toni di grigio
2 % Inew: l'immagine dopo l'operazione di filtraggio puntuale
3 I = imread('cameraman.tif');
4 a = 100;
5 b = 200;
6 LUT = zeros(1, 256);
7 for i = 1:256
8 r = i - 1;
9 if r < a
10 LUT(i) = a;
11 elseif r <= b & r >= a
12 LUT(i) = r;
13 elseif r > b
14 LUT(i) = b;
15 end
16 end
17 Inew = uint8(LUT(I + 1));
18 figure, imshow(Inew);
3. Inversione dell'Immagine (Effetto Negativo)
Calcolo del negativo di un'immagine utilizzando una LUT per ottimizzare le prestazioni.
1 I = imread('cameraman.tif');
2 figure, imshow(I), title('Immagine originale')
3
4 LUT = [];
5 for i = 0:255
6 r = i;
7 LUT(i + 1) = 255 - r;
8 end
9 I_new = uint8(LUT(I + 1));
10 figure;
11 imshow(I_new), title('Immagine filtrata')
4. Filtraggio Spaziale: Filtro di Media
Applicazione di un filtro di smoothing (media mobile) per ridurre il rumore o sfocare l'immagine.
1 I = imread('peppers.png');
2 I = rgb2gray(I);
3 figure, imshow(I), title('Immagine originale')
4
5 H = fspecial('average', 15)
6 I_new = imfilter(I, H, 'replicate');
7
8 figure, imshow(I_new), title('Immagine filtrata')
5. Analisi in Frequenza: DFT di un Segnale Sinusoidale
Calcolo e visualizzazione della Trasformata Discreta di Fourier (DFT) per un segnale tempo-continuo campionato.
1 Dt = 0.01;
2 fc = 1 / Dt;
3 t = 0:Dt:1 - Dt;
4 N = length(t);
5
6 fsig = 10;
7 y = sin(2 * pi * fsig * t);
8 Y = fft(y);
9 YY = fftshift(Y);
10
11 mu = -fc / 2 : fc / N : (fc / 2 - fc / N);
12 figure, stem(mu, abs(YY));
13 title('DFT del segnale');
14 xlabel('frequenze (Hz)');
15 ylabel('magnitudo');
6. Implementazione della Cross-correlazione 1D
Algoritmo per il calcolo della cross-correlazione tra due segnali discreti.
1 clear all
2 close all
3
4 x1 = [1 1 1 1 1 1 1 1]; % segnale 1
5 x2 = [1 2 3 4 5 6 7 8]; % segnale 2
6
7 M = length(x1);
8 N = length(x2);
9 C = M + N - 1;
10
11 tx1 = [zeros(1, N - 1), x1, zeros(1, N - 1)];
12 tx2 = [x2, zeros(1, M - 1 + N - 1)];
13
14 xC = zeros(1, C);
15 for i = 1:C
16 xC(i) = sum(tx1 .* tx2);
17 tx2(end) = [];
18 tx2 = [0 tx2];
19 end
Giustificazione
La variabile C definisce il numero totale di iterazioni del ciclo for (gli scorrimenti relativi tra i due segnali) e, di conseguenza, la lunghezza del vettore risultante xC.
Per definizione matematica, l'operazione di cross-correlazione (così come la convoluzione lineare) tra due segnali discreti 1D aventi lunghezza M e N produce sempre un segnale in uscita di lunghezza esatta pari a M + N - 1.
7. Spettro di Ampiezza con Riordinamento (fftshift)
Analisi spettrale di un segnale sinusoidale con corretta mappatura dell'asse delle frequenze.
1 mu_s = 100;
2 Dt = 1 / mu_s;
3 t = -0.5:Dt:0.5 - Dt;
4 N = length(t);
5
6 mu = 20;
7 f = sin(2 * pi * mu * t);
8
9 F = fft(f);
10 Fs = fftshift(F);
11 mu_max = mu_s / 2;
12 mu_sampling = mu_s / N;
13 mu = -mu_max : mu_sampling : mu_max - mu_sampling; % nuovo vettore frequenze
14 figure
15 stem(mu, abs(Fs), 'LineWidth', 3)
16 xlabel('frequenza (Hz)')
17 ylabel('|Fs|')
18 grid
19 title('DFT (abs) con riordinamento');
Giustificazione
Osservando il grafico dello spettro di ampiezza fornito, si notano due chiari picchi (impulsi) in corrispondenza delle frequenze -20 Hz e +20 Hz. Alla riga 7, il segnale da analizzare viene generato con la funzione f = sin(2π * μ * t). In questa equazione canonica, la variabile μ rappresenta la frequenza fondamentale dell'onda sinusoidale. Affinché la Trasformata di Fourier restituisca i picchi a ±20 Hz, il segnale generato deve avere una frequenza di 20 Hz, rendendo necessaria la definizione di μ = 20 prima del suo utilizzo.
8. Template Matching tramite Cross-correlazione 2D
Utilizzo della funzione xcorr2 per identificare pattern specifici all'interno di un'immagine.
1 immagine = imread('ImmCrosCorl.png'); % Immagine di dimensione 25 x 25
2
3 template = 0.2 * ones(9);
4 template(2:end, :) = 0;
5
6 cc = xcorr2(immagine, template);
7 figure, imagesc(cc)
8 title('Matrice di cross correlazione 2D')
L'operazione xcorr2 esegue una cross-correlazione 2D, che nel campo dell'elaborazione delle immagini funziona come un template matching (ricerca di pattern). La matrice risultante ha valori tanto più alti (colori più chiari) quanto più l'immagine originale assomiglia al template in quel punto.
Osservando la "Matrice di cross correlazione 2D", notiamo che i picchi massimi di luminosità si trovano esattamente in corrispondenza delle due linee orizzontali dell'immagine originale. Al contrario, la linea verticale e quella tratteggiata diagonale producono un segnale molto debole e sfocato.
Questo ci dice in modo inequivocabile che il template che stiamo cercando è una linea orizzontale.
italiano con una dimensione di 6,16 KB