In questo articolo mostrerò come definire ed applicare, mediante script in Matlab, alcuni filtri per immagini digitali: media aritmetica e geometrica, mediano, mid-point e controarmonico.
Per alcuni comandi di manipolazione delle immagini in forma di matrici (size, cicli for, uint8, ...) si rimanda all'articolo, pubblicato precedentemente, sulle basi dell'elaborazione delle immagini digitali mediante Matlab.
Questo script non va ricopiato per intero in una volta, ma eseguito 'passo-passo', ogni volta che trovate una riga contenente una o più istruzioni imshow: in effetti, con questo script vengono presentati più filtri, con dimensioni di maschere differenti, che mostrati tutti insieme genererebbero solo confusione...
>> clear;
>> immagine = zeros(234,234);
>> for i=1:9
immagine(12:224, ((17*i+(7*(i-1))):(17*i+(7*(i-1)+7)))) = 1;
end;
>> imshow(immagine);
% Applico i filtri di media aritmetica
>> w1 = fspecial('average', [3,3]);
>> arit3x3 = imfilter(immagine,w1);
>> w2 = fspecial('average', [5,5]);
>> arit5x5 = imfilter(immagine,w2);
>> w3 = fspecial('average', [7,7]);
>> arit7x7 = imfilter(immagine,w3);
>> subplot(2,2,1); imshow(immagine); subplot(2,2,2); imshow(arit3x3); subplot(2,2,3); imshow(arit5x5); subplot(2,2,4); imshow(arit7x7);
% Applico i filtri di media geometrica
>> mediaGeometrica3x3 = gmean(immagine, 3,3);
>> mediaGeometrica5x5 = gmean(immagine, 5,5);
>> mediaGeometrica7x7 = gmean(immagine, 7,7);
>> subplot(2,2,1); imshow(immagine); subplot(2,2,2); imshow(mediaGeometrica3x3); subplot(2,2,3); imshow(mediaGeometrica5x5); subplot(2,2,4); imshow(mediaGeometrica7x7);
% Applico il filtro mediano
>> mediano3x3 = medfilt2(immagine, [3,3]);
>> mediano5x5 = medfilt2(immagine, [5,5]);
>> mediano7x7 = medfilt2(immagine, [7,7]);
>> subplot(2,2,1); imshow(immagine); subplot(2,2,2); imshow(mediano3x3); subplot(2,2,3); imshow(mediano5x5); subplot(2,2,4); imshow(mediano7x7);
% Applico il filtro mid-point
>> minimo3x3 = ordfilt2(immagine, 1, ones(3,3));
>> massimo3x3 = ordfilt2(immagine, 9, ones(3,3));
>> midpoint3x3 = 0.5 .*(minimo3x3 + massimo3x3);
>> minimo5x5 = ordfilt2(immagine, 1, ones(5,5));
>> massimo5x5 = ordfilt2(immagine, 25, ones(5,5));
>> midpoint5x5 = 0.5 .*(minimo5x5 + massimo5x5);
>> minimo7x7 = ordfilt2(immagine, 1, ones(7,7));
>> massimo7x7 = ordfilt2(immagine, 49, ones(7,7));
>> midpoint7x7 = 0.5 .*(minimo7x7 + massimo7x7);
>> subplot(2,2,1); imshow(immagine); subplot(2,2,2); imshow(midpoint3x3); subplot(2,2,3); imshow(midpoint5x5); subplot(2,2,4); imshow(midpoint7x7);
% Applico il filtro di media controarmonica con Q=1
>> controarmonico3x3 = charmean(immagine, 3,3, 1);
>> controarmonico5x5 = charmean(immagine, 5,5, 1);
>> controarmonico7x7 = charmean(immagine, 7,7, 1);
>> subplot(2,2,1); imshow(immagine); subplot(2,2,2); imshow(controarmonico3x3); subplot(2,2,3); imshow(controarmonico5x5); subplot(2,2,4); imshow(controarmonico7x7);