Why my calculation of standard deviation of an image is different from the built-in function
Afficher commentaires plus anciens
Hello,
My code is shown below, and I opened the built-in function. I found it just calculates the square root or variance. So, the method is the same. I don't know why.
function ret = yStdDeva(im)
tic;
[tR, tC] = size(im);
mean1 = mean(im(:));
% Calculate square of difference between pixels and mean
sdpm = (double(im) - mean1).^2;
sum_sdpm = sum(sdpm(:));
% Calculate variance
imvar = (1/(tR*tC ))*sum_sdpm;
% Calculate Standard deviation
ret = (imvar)^(1/2);
toc;
Réponses (4)
You simply use a wrong formula: You have to normalize by the number of elements minus 1. In addition there can be a difference between SQRT and ^0.5 due to the different numerical implementations.
d = double(im);
C = d(:) - mean(d(:));
S = sqrt(sum(C .* C, 1) ./ (numel(d) - 1)):
ZhG
le 28 Juin 2013
0 votes
3 commentaires
Iain
le 28 Juin 2013
The problem is wind-up. To see it, try these at command line:
uint8(255) + uint8(1) - uint8(1) % Get it here
uint16(255) + uint16(1) - uint16(1) % Don't get it here
double(10^30) + double(1) - double(10^30) % Get it here
double(10^30) - double(10^30) + double(1) % Don't get it here
Operations on integer types are affected of the saturaion:
uint8(250) + uint8(250) == uint8(255) !!
Iain
le 28 Juin 2013
Wind-up is a type of saturation, and I use the terms almost interchangably.
Image Analyst
le 28 Juin 2013
I don't see much difference - just a really slight difference (less than a thousandth of a gray level):
im=imread('cameraman.tif');
% Your way:
[tR, tC] = size(im);
mean1 = mean(im(:));
% Calculate square of difference between pixels and mean
sdpm = (double(im) - mean1).^2;
sum_sdpm = sum(sdpm(:));
% Calculate variance
imvar = (1/(tR*tC ))*sum_sdpm;
% Calculate Standard deviation
ret = (imvar)^(1/2)
% Standard, built-in way:
std(double(im(:)))
In the command window:
ret =
62.3412396872523
ans =
62.3417153186086
Why are you wanting to do it yourself anyway? Why not just use std()?
1 commentaire
ZhG
le 28 Juin 2013
ZhG
le 28 Juin 2013
0 votes
Catégories
En savoir plus sur Images dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!