function mg_local_moment, image, width, double=double, $
sdev=sdev, variance=variance, skewness=skewness, $
kurtosis=kurtosis, edge_truncate=edge_truncate, $
edge_wrap=edge_wrap, edge_zero=edge_zero
compile_opt strictarr
on_error, 2
if (n_params() ne 2) then message, 'incorrect number of arguments'
if (size(image, /n_dimensions) ne 2) then begin
message, 'IMAGE parameter must be a 2D array'
endif
im = keyword_set(double) ? double(image) : float(image)
kernel = keyword_set(double) $
? dblarr(width, width) + 1.0D $
: fltarr(width, width) + 1.0
n = width^2
local_mean = convol(im, kernel, edge_truncate=edge_truncate, $
edge_wrap=edge_wrap, edge_zero=edge_zero) / n
if (arg_present(sdev) $
|| arg_present(variance) $
|| arg_present(skewness) $
|| arg_present(kurtosis)) then begin
squared = convol(im^2, kernel, edge_truncate=edge_truncate, $
edge_wrap=edge_wrap, edge_zero=edge_zero)
variance = (squared - n * local_mean^2) / (n - 1.0)
sdev = sqrt(variance)
endif
if (arg_present(skewness) || arg_present(kurtosis)) then begin
cubed = convol(im^3, kernel, edge_truncate=edge_truncate, $
edge_wrap=edge_wrap, edge_zero=edge_zero)
skewness = (cubed / n - 3.0 * local_mean * squared / n + 2.0 * local_mean^3) / sdev ^ 3
endif
if (arg_present(kurtosis)) then begin
fourth = convol(im^4, kernel, edge_truncate=edge_truncate, $
edge_wrap=edge_wrap, edge_zero=edge_zero)
kurtosis = (fourth / n - 4.0 * local_mean * cubed / n + 6.0 * local_mean^2 * squared / n - 3.0 * local_mean^4) / variance^2 - 3.0
endif
return, local_mean
end