Filtro di massimo Matlab

Darèios89
Per applicare un filtro di minimo ho scritto un codice, che però non fa nulla, potreste cercare di dirmi dove sbaglio?


clear all;
close all;

A=double(imread('lena.jpg'));
B=zeros(size(A));
[m,n]=size(A);

for i=2: m-1
    for j=2: n-1
            vett=[A(i,j-1), A(i,j+1), A(i-1,j), A(i+1,j)];
            sort(vett);
            B(i,j)=vett(1);
    end
end

C=imfilter(A,B);
figure,
subplot(1,2,1), imshow(uint8(A),[]), title('Originale');
subplot(1,2,2), imshow(uint8(C),[]), title('Filtro di Massimo');

Risposte
apatriarca
Come è definito questo filtro? Ho l'impressione che tu l'abbia definito nel modo sbagliato. Da come è definito B sembrerebbe già essere il risultato del filtraggio. Hai provato a visualizzare semplicemente B come immagine e non usare imfilter?

Darèios89
Si ho provato ma si vede l' immagine tutta bianca e non capisco perchè..
B dovrebbe contenere i valori modificati, dove per ogni pixel si ha il massimo preso in un intorno di (x,y) però non la visualizza lo stesso, appare bianca...

apatriarca
Ho notato un primo problema:
sort(vett);

Matlab non fa un ordinamento in-place, non modifica cioè l'array o la matrice di partenza. Devi quindi assegnare il risultato a qualche vettore per poterlo usare. Ma è stupido usare un algoritmo di ordinamento per trovare il minimo di un vettore. L'ordinamento ha infatti complessità maggiore della ricerca del minimo. Matlab ha comunque una funzione specifica per farlo in ogni caso:
B(i,j) = min([A(i,j-1), A(i,j+1), A(i-1,j), A(i+1,j)]);

Darèios89
Urca hai ragione :-D
Dimenticavo di quanto fosse potente Matlab, adesso funziona alla grande. Una precisazione, del resto fare come avevo fatto io, usare imfilter dovrebbe essere sbagliato perchè comunque non ho un Kernel, quindi non posso fare mica convoluzioni.

Ora funziona, grazie:

clear all;
close all;

A=double(imread('lena.jpg'));
B=zeros(size(A));
[m,n]=size(A);

for i=2: m-1
    for j=2: n-1
            B(i,j)=max([A(i,j-1), A(i,j+1), A(i-1,j), A(i+1,j)]);
           %B(i,j)=min([A(i,j-1), A(i,j+1), A(i-1,j), A(i+1,j)]);
    end
end


figure,
subplot(1,2,1), imshow(uint8(A),[]), title('Originale');
subplot(1,2,2), imshow(uint8(B),[]), title('Filtro di Massimo');
%subplot(1,2,2), imshow(uint8(B),[]), title('Filtro di Minimo');

            

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.