Risultato di elaborazione in Matlab
Avevo pensato di provare a modificare un' immagine, e di ottenere la corrispondente in bianco e nero.
Intanto, i file in matlab al momento del salvataggio non si possono salvare con il carattere spazio vero? Avevo fatto una prima prova, con una immagine jpeg ma non ho ottenuto un bianco e nero, ho pensato che il motivo è che il jpeg è un formato di compressione, allora ho caricato una immagine in bmp, e sembra che parte del risultato ci sia.
Praticamente voglio mettere a confronto le immagini, solo che l' immagine di partenza, mi si presenta in scala di grigio, e non a colori, come mai? Sperando che non sia errato il codice, praticamente per avere bianco e nero dovrei stabilire una soglia T, e impostare a nero, cioè 0 tutti i pixel con valore inferiore a tale soglia e a 255 gli altri:
Invece, stavo cercando di applicare ad un' immagine un filtro 3-Box, da quello che ho capito devo creare una matrice con tutti gli elementi pari a [tex]\frac{1}{9}[/tex] e moltiplicarla per la matrice di partenza, però ad un certo punto del codice non riesco ad eseguire il prodotto e non capisco perchè:
Intanto, i file in matlab al momento del salvataggio non si possono salvare con il carattere spazio vero? Avevo fatto una prima prova, con una immagine jpeg ma non ho ottenuto un bianco e nero, ho pensato che il motivo è che il jpeg è un formato di compressione, allora ho caricato una immagine in bmp, e sembra che parte del risultato ci sia.
Praticamente voglio mettere a confronto le immagini, solo che l' immagine di partenza, mi si presenta in scala di grigio, e non a colori, come mai? Sperando che non sia errato il codice, praticamente per avere bianco e nero dovrei stabilire una soglia T, e impostare a nero, cioè 0 tutti i pixel con valore inferiore a tale soglia e a 255 gli altri:
clear all; close all; A=imread('lena.bmp'); B=A; c=100; [m,n]=size(A); for i=1:m for j=1:n if(A(i,j)<=c) A(i,j)=0; else A(i,j)=255; end end end subplot(1,2,1), subimage(B), title('Originale'); subplot(1,2,2), subimage(A), title('Bianco e nero');
Invece, stavo cercando di applicare ad un' immagine un filtro 3-Box, da quello che ho capito devo creare una matrice con tutti gli elementi pari a [tex]\frac{1}{9}[/tex] e moltiplicarla per la matrice di partenza, però ad un certo punto del codice non riesco ad eseguire il prodotto e non capisco perchè:
clear all; close all; A=imread('lena.jpg'); [m,n]=size(A); B=1/9+zeros(m,n); C=A*B; %errore subplot(1,2,1), subimage(A), title('Originale'); subplot(1,2,2), subimage(C), title('Filtro 3-box');
Risposte
Ne abbiamo gia' accennato nel topic precedente.
Non è che puoi prendere un file è trattarlo TUTTO senza tener conto di cosa ci sia all'interno.
Un file bmp puoi convertirlo, ma devi sempre leggerne la struttura.
Nei primi 54 byte (se non erro) del file trovi tutta una serie di dati che andrebbero letti proprio per capirne la struttura e quindi trattare il file in modo adeguato.
Troverai la grandezza del file in pixel, la dimensione del pixel (numeri di colori), ed altre info importanti
Esempio:
Ho creato un bmp con paint ed ho letto la struttura di questo file usando un normalissimo editor esadecimale:

Ho cerchiato in neretto una delle informazioni principali (numero dei bit di colori)
8 rappresenta 8 bit, ovvero ogni pixel in un byte (paint lo chiama bmp a 256 colori). In questo caso la tua routine di bianco-nero potrebbe funzionare (ma devi sempre trasformare la sola parte dati, non l'intero file).
Spero di essere stato chiaro...
Non è che puoi prendere un file è trattarlo TUTTO senza tener conto di cosa ci sia all'interno.
Un file bmp puoi convertirlo, ma devi sempre leggerne la struttura.
Nei primi 54 byte (se non erro) del file trovi tutta una serie di dati che andrebbero letti proprio per capirne la struttura e quindi trattare il file in modo adeguato.
Troverai la grandezza del file in pixel, la dimensione del pixel (numeri di colori), ed altre info importanti
Esempio:
Ho creato un bmp con paint ed ho letto la struttura di questo file usando un normalissimo editor esadecimale:

Ho cerchiato in neretto una delle informazioni principali (numero dei bit di colori)
8 rappresenta 8 bit, ovvero ogni pixel in un byte (paint lo chiama bmp a 256 colori). In questo caso la tua routine di bianco-nero potrebbe funzionare (ma devi sempre trasformare la sola parte dati, non l'intero file).
Spero di essere stato chiaro...
Mh...insomma
Ma se io non ho quel programma, da matlab posso fare questa lettura?
In ogni caso, non capisco perchè devo trasformare parte dei dati, e soprattutto non capisco quali, pensavo si usasse quel criterio, per ogni pixel, se il valore è inferiore ad una soglia T allora lo pongo a 0, altrimenti a 255. Non capisco perchè devo lavorare solo su parte dei dati e quali..

Ma se io non ho quel programma, da matlab posso fare questa lettura?
In ogni caso, non capisco perchè devo trasformare parte dei dati, e soprattutto non capisco quali, pensavo si usasse quel criterio, per ogni pixel, se il valore è inferiore ad una soglia T allora lo pongo a 0, altrimenti a 255. Non capisco perchè devo lavorare solo su parte dei dati e quali..
imread legge immagini di diversi formati e restituisce una matrice. Se ne occupa quella funzione di decomprimere le immagini e convertirle in matrici della dimensione corretta come si può leggere nella corrispondente pagina di documentazione (http://www.mathworks.com/help/techdoc/ref/imread.html). Il formato in cui è salvata l'immagine non è importante (o almeno non dovrebbe esserlo).
Nel secondo esercizio hai commesso l'errore grave di pensare di dover fare un prodotto per applicare un filtro. Devi fare una CONVOLUZIONE. Rileggiti bene la teoria e dai un occhiata alla funzione filter2 (http://www.mathworks.com/help/techdoc/ref/filter2.html). In questo modo dovresti riuscire ad applicare il filtro senza problemi.
Nel primo non vedo niente di sbagliato e non ho modo di testarlo. Se l'immagine a colori non capisco perché la matrice venga letta in scala di grigio. È da un po' che non lavoro sulle immagini in matlab e dovrei riguardarmi un po' le vecchie esercitazioni.
P.S. Un metodo alternativo (senza usare cicli) per trasformare in bianco e nero la tua immagine potrebbe essere:
Quando scrivi qualcosa come A <= c viene creata una matrice di valori booleani (0 o 1) a seconda che la cella corrispondente rispetti o meno la condizione. Questa matrice la puoi quindi moltiplicare per un qualche valore come in questo caso o anche come indici:
Nel secondo esercizio hai commesso l'errore grave di pensare di dover fare un prodotto per applicare un filtro. Devi fare una CONVOLUZIONE. Rileggiti bene la teoria e dai un occhiata alla funzione filter2 (http://www.mathworks.com/help/techdoc/ref/filter2.html). In questo modo dovresti riuscire ad applicare il filtro senza problemi.
Nel primo non vedo niente di sbagliato e non ho modo di testarlo. Se l'immagine a colori non capisco perché la matrice venga letta in scala di grigio. È da un po' che non lavoro sulle immagini in matlab e dovrei riguardarmi un po' le vecchie esercitazioni.
P.S. Un metodo alternativo (senza usare cicli) per trasformare in bianco e nero la tua immagine potrebbe essere:
A = (A >= c) * 255;
Quando scrivi qualcosa come A <= c viene creata una matrice di valori booleani (0 o 1) a seconda che la cella corrispondente rispetti o meno la condizione. Questa matrice la puoi quindi moltiplicare per un qualche valore come in questo caso o anche come indici:
A(A >= c) = 255; A(A < c) = 0;
"Darèios89":
Mh...insomma![]()
Ma se io non ho quel programma, da matlab posso fare questa lettura?
In ogni caso, non capisco perchè devo trasformare parte dei dati, e soprattutto non capisco quali, pensavo si usasse quel criterio, per ogni pixel, se il valore è inferiore ad una soglia T allora lo pongo a 0, altrimenti a 255. Non capisco perchè devo lavorare solo su parte dei dati e quali..
Non è che hai bisogno di un editor per fare questa lettura.
Ho usato un editor, solo per farti osservare che nel file (nel suo insieme), sono presenti dei dati che sono informazioni del file, ed altri dati che sono le vere informazioni dei pixel.
Se intendi operare direttamente sul file (senza usare routine, come ti dice apatriarca), devi conoscere ESATTAMENTE la struttura delle informazioni, ed intervenire solo e solamente sulla parte dei dati.
http://it.kioskea.net/contents/video/format-bmp.php3
.
Per quanto riguarda l' applicazione del filtro N-Box, si dovrebbe fare, una convoluzione tra l' immagine di partenza e il kernel, se non sbaglio.
Ora l' immagine ce l' ho, non devo moltiplicare per la matrice che ha ogni elemento pari a [tex]\frac{1}{n^2}[/tex]?
Altrimenti non ho capito come devo procedere, devo moltiplicare forse l' immagine per il filtro del kernel? cioè a partire da quella matrice con elementi pari a [tex]\frac{1}{n^2}[/tex] calcolare il corrispondente filtro e moltiplicarlo per l' immagine di partenza? Non ho capito questa parte, e le funzioni matlab, visto che non so come procedere, non mi aiutano gran che...
Ora l' immagine ce l' ho, non devo moltiplicare per la matrice che ha ogni elemento pari a [tex]\frac{1}{n^2}[/tex]?
Altrimenti non ho capito come devo procedere, devo moltiplicare forse l' immagine per il filtro del kernel? cioè a partire da quella matrice con elementi pari a [tex]\frac{1}{n^2}[/tex] calcolare il corrispondente filtro e moltiplicarlo per l' immagine di partenza? Non ho capito questa parte, e le funzioni matlab, visto che non so come procedere, non mi aiutano gran che...
Come ti ho detto devi fare una convoluzione che non è uguale al prodotto matriciale. Puoi implementarlo a mano oppure usare la funzione filter2 che ti ho consigliato. Dovresti imparare a leggere la documentazione di matlab perché molto utile. Il filtro è quella matrice di dimensione $n*n$ (nel tuo caso) e con tutti gli elementi uguali a $1/n^2$. Crei per prima cosa quel filtro con qualcosa come:
Applichi quindi il filtro all'immagine usando la convoluzione bidimensionale:
dove A è l'immagine originale e B è l'immagine filtrata. Se invece devi implementare la convoluzione manualmente, leggiti la definizione sul tuo libro di teoria o leggi questa pagina: http://www.mathworks.com/help/techdoc/ref/conv2.html.
nbox = ones(n,n) / (n*n);
Applichi quindi il filtro all'immagine usando la convoluzione bidimensionale:
B = filter(nbox, A);
dove A è l'immagine originale e B è l'immagine filtrata. Se invece devi implementare la convoluzione manualmente, leggiti la definizione sul tuo libro di teoria o leggi questa pagina: http://www.mathworks.com/help/techdoc/ref/conv2.html.
Mh ci sono riuscito.....però così:
Ma se scrivessi una cosa come:
Dove m ed n sono calcolati prima, mi visualizza bianca l' immagine 3-box, forse perchè sono valori troppo alti.
Quando li avevo calcolati erano 250 e 700 circa.
Grazie di tutto comunque...
clear all; close all; A=imread('lena.jpg'); nbox=ones(2,5)*(1/9); C=imfilter(A,nbox); figure, subplot(1,2,1), imshow(A), title('Originale'); subplot(1,2,2), imshow(C), title('Filtro 3-box');
Ma se scrivessi una cosa come:
nbox=ones(m,n)*(1/9);
Dove m ed n sono calcolati prima, mi visualizza bianca l' immagine 3-box, forse perchè sono valori troppo alti.
Quando li avevo calcolati erano 250 e 700 circa.
Grazie di tutto comunque...

Le immagini vengono colorate in bianco e nero mettendo a nero il valore più basso e bianco il valore più alto e poi usando una scala lineare. Per cui nel tuo caso, essendo costante, viene visualizzata di un solo colore (bianco). Non ha comunque molto senso visualizzarla come immagine. Non mi è per niente chiaro perché hai deciso di prendere il filtro di dimensione 2x5. Dovrebbe essere 3x3 per il filtro 3-box. Cioè:
Non è possibile che i valori di nbox siano di 250-700 se l'hai definito in quel modo. Ma come hai calcolato questi valori?
P.S. Se provi a leggere la descrizione della tua funzione imfilter, è equivalente a filter2 quando vengono usate le impostazioni di default. Mi stupisce che tu non sia riuscito ad usare quella funzione.
nbox = ones(3,3)*(1/9);
Non è possibile che i valori di nbox siano di 250-700 se l'hai definito in quel modo. Ma come hai calcolato questi valori?
P.S. Se provi a leggere la descrizione della tua funzione imfilter, è equivalente a filter2 quando vengono usate le impostazioni di default. Mi stupisce che tu non sia riuscito ad usare quella funzione.
Bè mi sono riletto meglio la teoria per capire meglio il filtraggio, si fa la convoluzione del kernel del filtro con l' immagine. Ho cambiato le cose come hai detto tu per avere un filtro nbox, ho usato imfilter perchè avevo trovato un esempio, non sono molto bravo con l' inglese, ma filter2 vuole un terzo parametro che non so cosa sia, se mi funziona imfilter penso non ci siano problemi ad usare quella...
Dimenticavo, i valori m ed n di cui parlo erano sbagliati, non c' entrano, erano le righe e colonne della matrice di partenza, nel codice che ho postato non l' ho scritto ma precedentemente le avevo calcolate, ma è sbagliato perchè devo passare le dimensioni del filtro, in questo caso 3,3.
Dimenticavo, i valori m ed n di cui parlo erano sbagliati, non c' entrano, erano le righe e colonne della matrice di partenza, nel codice che ho postato non l' ho scritto ma precedentemente le avevo calcolate, ma è sbagliato perchè devo passare le dimensioni del filtro, in questo caso 3,3.
imfilter e filter2 fanno più o meno la stessa cosa. Usa quello che preferisci.
Ok grazie mille, piuttosto che parire un nuovo topic, ne volevo approfittare per via di un dubbio.
Ho cercato di creare un Bayer Pattern, su un modello che già avevo, i codici mi sembrano molto simili, ma i risultati non combaciano, il modello a cui mi riferisco, che funziona bene è questo:
Il mio codice è molto simile, però, guardando l' immagine in falsi colori, la mia tende a generare dei quadretti, si dovrebbe vedere verde, e il bayer pattern reale si dovrebbe vedere in grigio ma ho dei quadretti bianchi, ma non capisco da cosa possa dipendere questa cosa....i codici, o meglio l' algoritmo mi sembra molto identico....
Ho cercato di creare un Bayer Pattern, su un modello che già avevo, i codici mi sembrano molto simili, ma i risultati non combaciano, il modello a cui mi riferisco, che funziona bene è questo:
clear all; close all; % Bayer Pattern % G B % R G J = double(imread('lena.jpg')); I = J; [m n t] = size(I); % m = numero righe , n = numero colonne for i=1:m for j=1:n if mod((i+j),2)==0 % Colonne dispari delle righe dispari e pari delle righe pari I(i,j,1)=0; I(i,j,3)=0; else if mod(j,2)==0 & mod(i,2)~=0 % Colonne pari delle righe dispari I(i,j,1)=0; I(i,j,2)=0; else I(i,j,2)=0; I(i,j,3)=0; end end end end figure, subplot(1,3,1), imshow(uint8(J),[]), title('Originale'); subplot(1,3,2), imshow(uint8(I),[]), title('Bayer Pattern - Falsi colori'); % Immagine Bayer Pattern reale II = I(:,:,1)+I(:,:,2)+I(:,:,3); subplot(1,3,3), imshow(uint8(II),[]), title('Bayer Pattern - Reale');
Il mio codice è molto simile, però, guardando l' immagine in falsi colori, la mia tende a generare dei quadretti, si dovrebbe vedere verde, e il bayer pattern reale si dovrebbe vedere in grigio ma ho dei quadretti bianchi, ma non capisco da cosa possa dipendere questa cosa....i codici, o meglio l' algoritmo mi sembra molto identico....
clear all; close all; % Bayer Pattern % G B % R G A=double(imread('lena.jpg')); B=A; [m,n,t]=size(B); for i=1: m for j=1: n if mod((i+j),2)==0 %colore verde B(i,j,1)=0; B(i,j,3)=0; else if mod(j,2)==0 & mod(i,2)~=0 %colore blu B(i,j,1)=0; B(i,j,2)=0; else B(i,j,2)=0; %colore rosso B(i,j,3)=0; end end end end C=B(:,:,1)+B(:,:,2)+B(:,:,3); figure, subplot(1,3,1), imshow(uint8(A),[]), title('Originale'); subplot(1,3,2), imshow(uint8(B),[]), title('Bayer Pattern falsi colori'); subplot(1,3,3), imshow(uint8(C),[]), title('Bayer Pattern reale');
Devo ammettere di non aver trovato alcuna motivazione per cui il primo codice dovrebbe dare un risultato diverso dal secondo. Hai provato a confrontare le matrici numericamente invece che visualizzandole su schermo?
Mh no non ci ho pensato....dici senza mettere punto e virgola vedendo dalla finestra di comando cosa spunta?
Sono molto grandi e lunghe da confrontare.....ho provato a vedere dalla finestra di comando le ultime righe...mi sembrano uguali......mah...strano......secondo te non ci dovrebbe essere un motivo per essere diverse...?
C' è un altro modo per confrontarle? Sono troppe le righe e colonne...non saprei effettuare un confronto diverso da quello offerto dalla finestra di comando.
Sono molto grandi e lunghe da confrontare.....ho provato a vedere dalla finestra di comando le ultime righe...mi sembrano uguali......mah...strano......secondo te non ci dovrebbe essere un motivo per essere diverse...?
C' è un altro modo per confrontarle? Sono troppe le righe e colonne...non saprei effettuare un confronto diverso da quello offerto dalla finestra di comando.
Con confrontarle intendevo dire qualcosa come:
cambiando volendo il tipo di norma (ma se non sai che cosa significhino lascia pure perdere). Se no puoi anche prendere la differenza e visualizzarla.
diff = norm(B - J);
cambiando volendo il tipo di norma (ma se non sai che cosa significhino lascia pure perdere). Se no puoi anche prendere la differenza e visualizzarla.
Allora, ho copiato in un unico file entrambi gli algoritmi e fatto la differenza come suggerivi tu, facendo:
Il risultato sembra più facile da leggere, ho provato a scorrere dall' alto in basso, e, mi è sembrato di non trovare sorprese, tutti i valori sono a 0, ripeto ho controllato cercando di stare attento ma mi sembra proprio siano tutti 0.
Il fatto a questo punto sembra davvero davvero strano....
Comunque visto che sei davvero così disponibile e ti ringrazio per questo, sei studente universitario?
Io studio Informatica a Catania, e sto facendo elaborazione delle immagini, sto facendo esercizi.........e ancora siamo all' inizio....
Guarda al limite non vorrei stressarti troppo....semmai chiedo se trovo il ragazzo che ha fatto l' altro algoritmo, sperando di rintracciarlo, e vedo se lui mi sa dire....piuttosto che stressarti per una cosa così
Z=diff(B-I)
Il risultato sembra più facile da leggere, ho provato a scorrere dall' alto in basso, e, mi è sembrato di non trovare sorprese, tutti i valori sono a 0, ripeto ho controllato cercando di stare attento ma mi sembra proprio siano tutti 0.
Il fatto a questo punto sembra davvero davvero strano....
Comunque visto che sei davvero così disponibile e ti ringrazio per questo, sei studente universitario?
Io studio Informatica a Catania, e sto facendo elaborazione delle immagini, sto facendo esercizi.........e ancora siamo all' inizio....

Guarda al limite non vorrei stressarti troppo....semmai chiedo se trovo il ragazzo che ha fatto l' altro algoritmo, sperando di rintracciarlo, e vedo se lui mi sa dire....piuttosto che stressarti per una cosa così

Sì, sono uno studente universitario. Studio matematica a Torino, ma ho frequentato un corso come il tuo (nel senso di elaborazione delle immagini) al Politecnico qualche anno fa. Se la differenza è nulla, vuol dire che il problema è solo nella visualizzazione. Ma non avendo più Matlab installato, credo sia meglio chiedere aiuto al tuo professore o al ragazzo che ha scritto quel codice per questo genere di problemi. Ho Octave, ma per qualche motivo non mi funziona imread e quindi non posso testare il tuo codice.