Why my calculation of standard deviation of an image is different from the built-in function
이전 댓글 표시
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;
답변 (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
2013년 6월 28일
0 개 추천
댓글 수: 3
Iain
2013년 6월 28일
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
2013년 6월 28일
Wind-up is a type of saturation, and I use the terms almost interchangably.
Image Analyst
2013년 6월 28일
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()?
카테고리
도움말 센터 및 File Exchange에서 Images에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!