Pages: [1]   Go Down
Print
Author Topic: Problema calcolo PSNR in Matlab  (Read 2489 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« on: 09-02-2011, 00:22:29 »

Cosa non va secondo voi?

Ho scritto una funzione che fa i calcoli:

Code:
function [PSNR,MSE] =psnr(A,Interpolata)
[m,n]=size(A);
MSE=0;
for x=1: m
    for y=1: n
        MSE=(MSE+A(x,y)-Interpolata(x,y)).^2;
        
    end
end

PSNR=-10*log10(MSE/(255^2));
%PSNR=10*log10((255^2)/MSE);
%PSNR=20*log10(255/sqrt(MSE));

end

Code:
clear all;
close all;

A=double(imread('lena.jpg'));
Interpolata=imresize(A,2,'bilinear');
[PSNR,MSE]=psnr(A,Interpolata)



Però come risultato ottengo:

Code:
PSNR =

  -Inf


MSE =

   Inf



Cosa non va secondo voi?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 09-02-2011, 01:13:06 »

Cosa non va secondo voi?

Il tuo codice interamente .

Prima di tutto, in MatLab è bene abituarsi a ragionare con oggetti più grossi possibili e con meno operazioni possibili.
Anche i cicli dovrebbero essere evitati quando è possibile fare dell'altro.

Seconda cosa, sul lato logico, è proprio sbagliato il calcolo di MSE: il tuo codice, in pratica, per ogni punto incrementa MSE del quadrato della somma tra il precedente MSE e l'errore d'interpolazione sul punto in analisi.
Se avessi 3 punti (unica riga) nella tua immagine, l'operazione farebbe questo:

\text{MSE}=0\\\text{MSE}=\({A\({1,\;1}\)-I\({1\;1}\)}\)^2\\\text{MSE}=\({\({A\({1,\;1}\)-I\({1\;1}\)}\)^2+A\({1,\;2}\)-I\({1\;2}\)}\)^2\\\text{MSE}=\({\({\({A\({1,\;1}\)-I\({1\;1}\)}\)^2+A\({1,\;2}\)-I\({1\;2}\)}\)^2+A\({1,\;3}\)-I\({1\;3}\)}\)^2

Non è certamente il valore dell'errore quadratico medio.

Vedi, si nota che hai usato l'operatore di elevamento a potenza puntuale (.^2), tuttavia operi sempre su uno scalare (mentre gli operatori puntuali hanno una utilità propria solo nel caso di matrici).
Io farei così:
Code:
function [PSNR,MSE] =psnr(A,Interpolata)
    SE=(A-Interpolata).^2;
    MSE=mean (SE (:));
    PSNR = 10*log10((255^2)/MSE);
end
« Last Edit: 09-02-2011, 01:30:06 by reversengineer » Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #2 on: 09-02-2011, 14:39:50 »

Si infatti il professore ha scritto quel codice, ma io volevo realizzare uno con i calcoli senza utilizzare funzioni predefinite, non potremmo correggere quello scritto da me?
Ora su questo computer non posso testarlo, più tardi proverò, ma avrei una sommatoria nel calcolo dell' MSE quindi non dovrei tenere conto dei valori precedenti per fare la somma?
Forse si deve cambiare:

Code:
MSE=0;
for x=1: m
    for y=1: n
        MSE=MSE+(A(x,y)-Interpolata(x,y)).^2;

Così?
Ad ogni modo vorrei riuscire a farlo senza l' uso di funzioni, più tardi controllo.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #3 on: 09-02-2011, 16:27:51 »

[...] vorrei riuscire a farlo senza l' uso di funzioni, più tardi controllo.
Tu puoi anche farlo senza usare funzioni di terze parti, ma se seguendo questo approccio cadi in cicli quando si può fare di meglio, ti posso dire che non hai fatto una buona programmazione  .

Usare costrutti interni MatLab non solo è cosa buona e giusta, ma ottimizza il codice, lo rende più veloce e giustamente richiede di ricordarsi cose complicate (quindi è più difficile, ma per via delle altre cose meritorio di una valutazione nettamente migliore).

Ora che ci penso forse e dico forse il mio codice funziona su immagini monocromatiche (e non RGB) ma dovrei controllare con più precisione e non ho veramente tempo boh.
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #4 on: 09-02-2011, 17:08:44 »

Quote
ti posso dire che non hai fatto una buona programmazione

Allora te lo dirò chiaramente.
A volte agli esami viene richiesto di implementare certe funzioni, senza utilizzare quelle apposite di matlab, magari non in questo caso perchè il PSNR non è poi così complicato, ma siccome in alcuni casi è richiesto di non usarle per esercizio stavo facendo una serie di operazioni manualmente.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Capooo85
Matricola
*
Offline Offline

Gender: Male
Posts: 33



« Reply #5 on: 09-02-2011, 18:15:54 »

Si infatti il professore ha scritto quel codice, ma io volevo realizzare uno con i calcoli senza utilizzare funzioni predefinite, non potremmo correggere quello scritto da me?
Ora su questo computer non posso testarlo, più tardi proverò, ma avrei una sommatoria nel calcolo dell' MSE quindi non dovrei tenere conto dei valori precedenti per fare la somma?
Forse si deve cambiare:

Code:
MSE=0;
for x=1: m
    for y=1: n
        MSE=MSE+(A(x,y)-Interpolata(x,y)).^2;

Così?
Ad ogni modo vorrei riuscire a farlo senza l' uso di funzioni, più tardi controllo.


Ma nel calcolo dell'MSE stai attento che c'è anche un 1/MN che moltiplica la sommatoria.

Inoltre
Code:
PSNR = 10*log10((255^2)/MSE)
Logged

Andrea S.
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #6 on: 09-02-2011, 19:05:46 »

Quote
ti posso dire che non hai fatto una buona programmazione

Allora te lo dirò chiaramente.
A volte agli esami viene richiesto di implementare certe funzioni, senza utilizzare quelle apposite di matlab, magari non in questo caso perchè il PSNR non è poi così complicato, ma siccome in alcuni casi è richiesto di non usarle per esercizio stavo facendo una serie di operazioni manualmente.

Questo cambia tutto e addossa tutta la colpa al docente pray.

Ovviamente si scherza. ok
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #7 on: 10-02-2011, 16:07:26 »

E' bastato correggere la mia dimenticanza sull' MSE che va diviso per il prodotto mxn e poi va bene anche la formula usata da me per il PSNR.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Pages: [1]   Go Up
Print
Jump to: