Deviazione Standard

*pippuzzo80
Salve,
vi espongo il mio problema:
ho un array di 256 elementi (rappresentano i valori RGB di un istogramma esempio: il valore array[0] mi indica quante volte il pixel 0 è ripetuto nell'istogramma R, G o B)

comunque, in pratica devo determinare la Deviazione Standard come fa Gimp o Photoshop in java.

Ho provato diverse formule ma il risultato si discosta da quello dato da questi due programmi di Foto, qualcuno sarebbe così gentile da postarmi la formula corretta per calcolare questa Deviazione Standard??


grazie

Risposte
Nidhogg
La deviazione standard è pari alla radice quadrata della somma dei quadrati delle differenze tra quantità per livello e media.

Prova questa formula!

Ciao!

spassky
Il mio prof ci aggiungeva sempre : "La radice quadrata POSITIVA del..."

CiUkInO1
La deviazione standard è pari alla radice quadrata della somma dei quadrati delle differenze tra quantità per livello e media.


Credo ci manca un fattore di normalizzazione che è pari alla grandezza del array. 255

*pippuzzo80
ok, provo e vi faccio sapere...

grazie

*pippuzzo80
Ho provato ad applicare la formula ma vengono risultati troppo grandi, come è possibile??

ho sbagliato qualcosa, vi posto la formula applicata
(math.pow è il quadrato, mentre math.sqrt è la radice quadrata...)

for (int i=0; i<256; i++)
{
DeviazionetempR+=Math.pow((IstoRed*i-MediaR),2);
DeviazionetempG+=Math.pow(((IstoGreen*i)-MediaG),2);
DeviazionetempB+=Math.pow(((IstoBlue*i)-MediaB),2);
}

DeviazioneStandardR=Math.sqrt(DeviazionetempR/256);
DeviazioneStandardG=Math.sqrt(DeviazionetempG/256);
DeviazioneStandardB=Math.sqrt(DeviazionetempB/256);

Nidhogg
Se posti tutto il codice è meglio. Comunque le tre medie come le hai calcolate?

*pippuzzo80
io posto anche l'altra parte di codice, comunque non c'entra niente perchè si riferisce alla media che è sicuramente giusta in quanto è lo stesso valore dato da photoshop o gimp

for (int i=0; i<256; i++)
{
MediatempR+=IstoRed*i;
MediatempG+=IstoGreen*i;
MediatempB+=IstoBlue*i;
}
//metodo utilizzato per determinare la Media
//(somma Quantità x Livello / numero totale dei pixel)
MediaR=MediatempR/Totale;
MediaG=MediatempG/Totale;
MediaB=MediatempB/Totale;

//radice quadrata della somma dei quadrati delle differenze tra Quantità x Livello e media
for (int i=0; i<256; i++)
{
DeviazionetempR+=Math.pow((IstoRed*i)-MediaR),2);
DeviazionetempG+=Math.pow(((IstoGreen*i)-MediaG),2);
DeviazionetempB+=Math.pow(((IstoBlue*i)-MediaB),2);
}

DeviazioneStandardR=Math.sqrt(DeviazionetempR/256);
DeviazioneStandardG=Math.sqrt(DeviazionetempG/256);
DeviazioneStandardB=Math.sqrt(DeviazionetempB/256);

ci sarà, forse, un errore nella formula perchè vengono risultati astronomici

Deviazione R 56376.66266996772
Deviazione G 185933.16454879567
Deviazione B 157843.60258122225

lorven
"pippuzzo80":


//radice quadrata della somma dei quadrati delle differenze tra Quantità x Livello e media
for (int i=0; i<256; i++)
{
DeviazionetempR+=Math.pow((IstoRed*i)-MediaR),2);
DeviazionetempG+=Math.pow(((IstoGreen*i)-MediaG),2);
DeviazionetempB+=Math.pow(((IstoBlue*i)-MediaB),2);
}


Non mi è chiaro perchè moltiplichi ciascun elemento dei vettori per il proprio indice.

*pippuzzo80
perchè nella formula scritta sopra recita: differenze tra Quantità x Livello e media

comunque ho anche provato a toglierlo il risultato sono questi valore:
Deviazione Standard R: 586.0909853745022
Deviazione Standard G: 726.5127611796387
Deviazione Standard B 620.566268917065

Quando invece con Gimp o Photoshop mi da questi risultati:
Deviazione Standard R: 49.3
Deviazione Standard G: 86,9
Deviazione Standard B 96,6

ma come è possibile tutta questa differenza??

lorven
Prova a togliere i prodotti con l'indice i; non mi pare che, calcolando una deviazione standard, si debba fare questo prodotto.

*pippuzzo80
"pippuzzo80":
perchè nella formula scritta sopra recita: differenze tra Quantità x Livello e media

comunque ho anche provato a toglierlo il risultato sono questi valore:
Deviazione Standard R: 586.0909853745022
Deviazione Standard G: 726.5127611796387
Deviazione Standard B 620.566268917065


Quando invece con Gimp o Photoshop mi da questi risultati:
Deviazione Standard R: 49.3
Deviazione Standard G: 86,9
Deviazione Standard B 96,6

ma come è possibile tutta questa differenza??


scusa forse non hai letto.... ma ho provato a toglierli ed il risultato è quello scritto sopra...

la cosa strana è che ho trovato in internet diverse formule è tutte si allineano con i valori trovati sopra (586,726,620) ma secondo voi sono dei risultati plausibili oppure sono troppo elevati??? ma allora Gimp o photoshop come cavolo ottiene quei risultati??

lorven
Sorry.
Comunque, vedo che lo stesso prodotto appare in precedenza, calcolando la media.

*pippuzzo80
Il calcolo della media è corretto in quanto si allinea con quello dato da GIMP o photoshop...

lorven
Prova ...

*pippuzzo80
scusa prova cosa?? :D

lorven
Calcolare la media senza i famigerati prodotti.

*pippuzzo80
ho provato... sempre valori molto alti...

lorven
Non so cosa consigliarti: mi pare, a questo punto, che non si tratti del semplice calcolo di una media e di una deviazione standard.

lorven
Un'ultima cosa. Vedo delle variabili non inizializzate: le tre Mediatemp, Totale e le tre DeviazioneStandard. Possono indurre errori; inizializzale a 0, tranne Totale, se già non è stato fatto altrove.

*pippuzzo80
questo è solo una parte del codice, ovviamente le variabili sono state inizializzate prima...


grazie comunque dell'aiuto...

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