[Digital image processing & Matlab]

Blackorgasm
Ciao a tutti! Volevo farvi una serie di domande che dipendono però dalla prima che vi farò:
Matlab come rappresenta le immagini in scala di grigi? Praticamente passandogli una immagine in scala di grigi, essa è rappresentata da una matrice con certi valori, a cosa corrispondono questi valori? Non credo siano le intensità dei pixel :|

grazie in anticipo

Risposte
hamming_burst
Ciao,
non so risponderti riguardo Matlab propriamente, perchè utilizzo delle librerie in C++ per elaborare immagini, ma vediamo se posso aiutarti.
Hai provato a stampare il contenuto di una cella? sono interi, float? la matrice è in dimensioni di pixel (es. 1024col 768righe) oppure ha un'altra misura?

PS: è una discussione di Informatica secondo me.

Blackorgasm
Ok la matrice ha la stessa grandezza dell'immagine in pixel, quindi forse sono veramente l'intensità dei pixel :| comunque sono numeri interi i valori della matrice e vanno da un minino pari a 0 ad un massimo pari a 255. Ho controllato nelle proprietà dell'immagine (che è .tif per la cronaca), e l'immagine ha una profondità in bit pari a 8, il che mi fa riflettere appunto :)

edit: l'immagine è 512x512

hamming_burst
"Blackorgasm":
Ok la matrice ha la stessa grandezza dell'immagine in pixel, quindi forse sono veramente l'intensità dei pixel :| comunque sono numeri interi i valori della matrice e vanno da un minino pari a 0 ad un massimo pari a 255. Ho controllato nelle proprietà dell'immagine (che è .tif per la cronaca), e l'immagine ha una profondità in bit pari a 8, il che mi fa riflettere appunto :)

non può esser altro che l'intensità...8 bit son 255 valori.
Per il tif vuol dire che è un'immagine lossless.

Blackorgasm
Perfetto :) adesso viene il bello, cioè devo implementare il filtro bilaterale.
Ho già implementato la maschera di smoothing guassiana, solo che questa maschera non deve alterare i contorni delle figure nell'immagine. Quindi secondo quello che abbiamo detto i contorni dovrebbero corrispondere a forti differenze di valore di componenti adiacenti della matrice giusto? Il problema è che io uso la funzione "filter2" per implementare il filtraggio in maniera automatica, però non posso in qualche modo "bloccarla" quando il valore centrale della maschera si trova su un pixel di bordo :| dovrei implementare il filtraggio in maniera ricorsiva non ottimizzata (cicli for per intendersi), che mi sembra appunto un disastro dal punto di vista computazionale. Qualcuno ha un'idea migliore? :)

hamming_burst
Che tipo di immagini sono, che soggetti? Lo sfondo è monocromo? I soggetti rispetto allo sfondo hanno una netta differenza di colore (contrasto rispetto la scala di grigi)? Sono immagini quasi perfette perciò senza difetti di blurring, sharp, ghost, noise ....

Blackorgasm
urca quante cose :) metto le mani avanti: questo lavoro lo devo fare per la tesina triennale, senza aver fatto nessun corso di elaborazione di immagini (che avrò all'ultimo anno della specialistica), quindi sto pian piano accumulando informazioni a destra e sinistra :D per questo sono un po' impacciato.
Allora questa immagine è suddivisa in varie zone, alcune tutte nere o tutte bianche, altre con varie tonalità di grigio, ed altre che sfumano da grigio chiaro a grigio scuro e così via..ed ovviamente hanno forme sia regolari che irregolari (alcune zone sono triangolari, altre una sorta di puzzle ecc..). Questa immagine me l'ha data il prof appunto per testare se l'algoritmo funziona in maniera corretta (perché poi la tesina continua con l'applicazione ad immagini all'infrarosso credo, ancora era da stabilire)

hamming_burst
è percaso questa o simile



:D

Blackorgasm


sono riuscito a caricarla :)

hamming_burst
Ciao,
scusa il ritardo...
bene l'immagine è statica.

"Blackorgasm":
Perfetto :) adesso viene il bello, cioè devo implementare il filtro bilaterale.
Ho già implementato la maschera di smoothing guassiana, solo che questa maschera non deve alterare i contorni delle figure nell'immagine.

questo dipende dalle proprietà dell'immagine e dai parametri dell'algoritmo.
Quindi secondo quello che abbiamo detto i contorni dovrebbero corrispondere a forti differenze di valore di componenti adiacenti della matrice giusto?

certo.

Il problema è che io uso la funzione "filter2" per implementare il filtraggio in maniera automatica, però non posso in qualche modo "bloccarla" quando il valore centrale della maschera si trova su un pixel di bordo :| dovrei implementare il filtraggio in maniera ricorsiva non ottimizzata (cicli for per intendersi), che mi sembra appunto un disastro dal punto di vista computazionale. Qualcuno ha un'idea migliore? :)

mmm questo è troppo legato all'implementazione di filter2() di matlab. Dovresti implementarla te e fare le dovute modifiche che vuoi.

In alternativa si possono percorrere altre strade penso.
Ma prima dimmi una cosa:
la maschera di smoothing guassiana

intendi il focus? O proprio l'algoritmo che applica lo smoothing?

Blackorgasm
Non ti preoccupare per il ritardo ;) ti ringrazio per l'aiuto che mi dai :D. Allora, intendo il focus; praticamente per ora ho creato una funzione che in ingresso prende l'immagine, la grandezza della maschera e la deviazione standard della gaussiana, ed in uscita restituisce l'immagine filtrata. Il filtraggio lo faccio appunto con filter2, che ora vorrei togliere per inserire il codice che mi permette di mantenere i bordi. Ho seguito questa strada per vedere se creavo in maniera corretta la maschera :)

Blackorgasm
Up!

hamming_burst
"Blackorgasm":
che ora vorrei togliere per inserire il codice che mi permette di mantenere i bordi.

forse mi son perso qualcosa, intendi il codice simil filter2() modificato?

Cmq fammi vedere il risultato di filter2() con i parametri attuali che hai inserito.

Blackorgasm
esatto dico quello :)

l'immagine filtrata con parametri N=9 (grandezza maschera) e stds=5 (deviazione standard gaussiana) è questa:

[img]http://i.imgur.com/FVJsb.jpg?1[/img]

metto anche il codice della funzione fatto fino ad ora:

function [ image_out,K ] = bilateral( image_in,N,stds )


A=double(image_in);
z=-(N-1)/2:(N-1)/2;
[x,y]=meshgrid(z);

arg=-(x.^2+y.^2)/(2*stds^2);
K=exp(arg);


% normalizzazione
s=sum(K(:));
if s~=0
    gauss=K/s;
end

image_out=uint8(filter2(gauss,A));

end

hamming_burst
grazie.
mmm che schifezzuola. Hai provato ad aumentare la maschera mantendendo la deviazione fissa?

Rissumendo: quello che vuoi fare è fare un blurring della superficie di ogni oggetto e separare nettamente i bordi, oppure vuoi fare anche un blurring sui bordi più leggero da armonizzare il tutto?

Blackorgasm
Si ho fatto varie prove: deviazione fissa ed incremento della maschera e viceversa, aumento (e decremento) contemporaneo della maschera e della deviazione. Si, il mio obiettivo è fare blurring mantenendo nettamente i bordi. A questo punto come mi hai detto voglio provare a modificare la filter2, eventualmente posto qualche problema se lo incontro :)
ps: ma schifezzuola perché non dovrebbe venire così?

vict85
Non so se ti può essere di aiuto ma potresti prendere qualche spunto dal loro edge-directed reconstruction filter.

hamming_burst
"Blackorgasm":
Si, il mio obiettivo è fare blurring mantenendo nettamente i bordi.

bene.
Un'idea è che potresti suddividere la figura con un edge-detector (canny, susan, ...) ed utilizzare il risultato come una maschera di taglio.
Ogni suddivisione la dividi in alcune sub-image a seconda del blurring che tu sita cercando.
Come vedi ci sono diverse sfumature, puoi utilizzare una sezione più chiara con quella vicina più scura per un blurring più adatto per quella superficie (si amalgamano meglio).
Un'altra idea (sempre con l'edge detector) è fare un blurring globale (come ha fatto), ma aggiungere in sovraimmagine la maschera di taglio dei bordi così hai la suddivisione netta...

A questo punto come mi hai detto voglio provare a modificare la filter2, eventualmente posto qualche problema se lo incontro :)

era solo una proposta, sarebbe da studiare a dovere e non è così facile a mio parere.

ps: ma schifezzuola perché non dovrebbe venire così?

mi aspetterei un risultato più armonioso, questo è proprio sfocato.

Blackorgasm
@vict85: grazie gli darò sicuramente un'occhiata :)

@hamming_burst: grazie di tutto l'aiuto che mi hai dato fino ad ora ;) provo a fare qualcosa e nell'eventualità posto i problemi quiì :D

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