📄 glcm_features2.m
字号:
glcm_mean = zeros(size_glcm_3,1);
glcm_var = zeros(size_glcm_3,1);
% http://www.fp.ucalgary.ca/mhallbey/glcm_mean.htm confuses the range of
% i and j used in calculating the means and standard deviations.
% As of now I am not sure if the range of i and j should be [1:Ng] or
% [0:Ng-1]. I am working on obtaining the values of mean and std that get
% the values of correlation that are provided by matlab.
u_x = zeros(size_glcm_3,1);
u_y = zeros(size_glcm_3,1);
s_x = zeros(size_glcm_3,1);
s_y = zeros(size_glcm_3,1);
% checked p_x p_y p_xplusy p_xminusy
p_x = zeros(size_glcm_1,size_glcm_3); % Ng x #glcms[1]
p_y = zeros(size_glcm_2,size_glcm_3); % Ng x #glcms[1]
p_xplusy = zeros((size_glcm_1*2 - 1),size_glcm_3); %[1]
p_xminusy = zeros((size_glcm_1),size_glcm_3); %[1]
% checked hxy hxy1 hxy2 hx hy
hxy = zeros(size_glcm_3,1);
hxy1 = zeros(size_glcm_3,1);
hx = zeros(size_glcm_3,1);
hy = zeros(size_glcm_3,1);
hxy2 = zeros(size_glcm_3,1);
corm = zeros(size_glcm_3,1);
corp = zeros(size_glcm_3,1);
for k = 1:size_glcm_3
glcm_sum(k) = sum(sum(glcm(:,:,k)));
glcm(:,:,k) = glcm(:,:,k)./glcm_sum(k); % Normalize each glcm
glcm_mean(k) = mean2(glcm(:,:,k)); % compute mean after norm
glcm_var(k) = (std2(glcm(:,:,k)))^2;
for i = 1:size_glcm_1
for j = 1:size_glcm_2
p_x(i,k) = p_x(i,k) + glcm(i,j,k);
p_y(i,k) = p_y(i,k) + glcm(j,i,k); % taking i for j and j for i
if (ismember((i + j),[2:2*size_glcm_1]))
p_xplusy((i+j)-1,k) = p_xplusy((i+j)-1,k) + glcm(i,j,k);
end
if (ismember(abs(i-j),[0:(size_glcm_1-1)]))
p_xminusy((abs(i-j))+1,k) = p_xminusy((abs(i-j))+1,k) +...
glcm(i,j,k);
end
end
end
end
% marginal probabilities are now available [1]
% p_xminusy has +1 in index for matlab (no 0 index)
% computing sum average, sum variance and sum entropy:
%Q = zeros(size(glcm));
i_matrix = repmat([1:size_glcm_1]',1,size_glcm_2);
j_matrix = repmat([1:size_glcm_2],size_glcm_1,1);
% i_index = [ 1 1 1 1 1 .... 2 2 2 2 2 ... ]
i_index = j_matrix(:);
% j_index = [ 1 2 3 4 5 .... 1 2 3 4 5 ... ]
j_index = i_matrix(:);
xplusy_index = [1:(2*(size_glcm_1)-1)]';
xminusy_index = [0:(size_glcm_1-1)]';
mul_contr = abs(i_matrix - j_matrix).^2;
mul_dissi = abs(i_matrix - j_matrix);
%div_homop = ( 1 + mul_contr); % used from the above two formulae
%div_homom = ( 1 + mul_dissi);
for k = 1:size_glcm_3 % number glcms
out.contr(k) = sum(sum(mul_contr.*glcm(:,:,k)));
out.dissi(k) = sum(sum(mul_dissi.*glcm(:,:,k)));
out.energ(k) = sum(sum(glcm(:,:,k).^2));
out.entro(k) = - sum(sum((glcm(:,:,k).*log(glcm(:,:,k) + eps))));
out.homom(k) = sum(sum((glcm(:,:,k)./( 1 + mul_dissi))));
out.homop(k) = sum(sum((glcm(:,:,k)./( 1 + mul_contr))));
% [1] explains sum of squares variance with a mean value;
% the exact definition for mean has not been provided in
% the reference: I use the mean of the entire normalized glcm
out.sosvh(k) = sum(sum(glcm(:,:,k).*((i_matrix - glcm_mean(k)).^2)));
out.indnc(k) = sum(sum(glcm(:,:,k)./( 1 + (mul_dissi./size_glcm_1) )));
out.idmnc(k) = sum(sum(glcm(:,:,k)./( 1 + (mul_contr./(size_glcm_1^2)))));
out.maxpr(k) = max(max(glcm(:,:,k)));
u_x(k) = sum(sum(i_matrix.*glcm(:,:,k)));
u_y(k) = sum(sum(j_matrix.*glcm(:,:,k)));
% using http://www.fp.ucalgary.ca/mhallbey/glcm_variance.htm for s_x
% s_y : This solves the difference in value of correlation and might be
% the right value of standard deviations required
% According to this website there is a typo in [2] which provides
% values of variance instead of the standard deviation hence a square
% root is required as done below:
s_x(k) = (sum(sum( ((i_matrix - u_x(k)).^2).*glcm(:,:,k) )))^0.5;
s_y(k) = (sum(sum( ((j_matrix - u_y(k)).^2).*glcm(:,:,k) )))^0.5;
corp(k) = sum(sum((i_matrix.*j_matrix.*glcm(:,:,k))));
corm(k) = sum(sum(((i_matrix - u_x(k)).*(j_matrix - u_y(k)).*glcm(:,:,k))));
out.autoc(k) = corp(k);
out.corrp(k) = (corp(k) - u_x(k)*u_y(k))/(s_x(k)*s_y(k));
out.corrm(k) = corm(k) / (s_x(k)*s_y(k));
out.cprom(k) = sum(sum(((i_matrix + j_matrix - u_x(k) - u_y(k)).^4).*...
glcm(:,:,k)));
out.cshad(k) = sum(sum(((i_matrix + j_matrix - u_x(k) - u_y(k)).^3).*...
glcm(:,:,k)));
out.savgh(k) = sum((xplusy_index + 1).*p_xplusy(:,k));
% the summation for savgh is for i from 2 to 2*Ng hence (i+1)
out.senth(k) = - sum(p_xplusy(:,k).*...
log(p_xplusy(:,k) + eps));
% compute sum variance with the help of sum entropy
out.svarh(k) = sum((((xplusy_index + 1) - out.senth(k)).^2).*...
p_xplusy(:,k));
% the summation for savgh is for i from 2 to 2*Ng hence (i+1)
% compute difference variance, difference entropy,
% out.dvarh2(k) = var(p_xminusy(:,k));
% but using the formula in
% http://murphylab.web.cmu.edu/publications/boland/boland_node26.html
% we have for dvarh
out.denth(k) = - sum((p_xminusy(:,k)).*...
log(p_xminusy(:,k) + eps));
out.dvarh(k) = sum((xminusy_index.^2).*p_xminusy(:,k));
% compute information measure of correlation(1,2) [1]
hxy(k) = out.entro(k);
glcmk = glcm(:,:,k)';
glcmkv = glcmk(:);
hxy1(k) = - sum(glcmkv.*log(p_x(i_index,k).*p_y(j_index,k) + eps));
hxy2(k) = - sum(p_x(i_index,k).*p_y(j_index,k).*...
log(p_x(i_index,k).*p_y(j_index,k) + eps));
hx(k) = - sum(p_x(:,k).*log(p_x(:,k) + eps));
hy(k) = - sum(p_y(:,k).*log(p_y(:,k) + eps));
out.inf1h(k) = ( hxy(k) - hxy1(k) ) / ( max([hx(k),hy(k)]) );
out.inf2h(k) = ( 1 - exp( -2*( hxy2(k) - hxy(k) ) ) )^0.5;
% eig_Q(k,:) = eig(Q(:,:,k));
% sort_eig(k,:)= sort(eig_Q(k,:),'descend');
% out.mxcch(k) = sort_eig(k,2)^0.5;
% The maximal correlation coefficient was not calculated due to
% computational instability
% http://murphylab.web.cmu.edu/publications/boland/boland_node26.html
end
% GLCM Features (Soh, 1999; Haralick, 1973; Clausi 2002)
% f1. Uniformity / Energy / Angular Second Moment (done)
% f2. Entropy (done)
% f3. Dissimilarity (done)
% f4. Contrast / Inertia (done)
% f5. Inverse difference
% f6. correlation
% f7. Homogeneity / Inverse difference moment
% f8. Autocorrelation
% f9. Cluster Shade
% f10. Cluster Prominence
% f11. Maximum probability
% f12. Sum of Squares
% f13. Sum Average
% f14. Sum Variance
% f15. Sum Entropy
% f16. Difference variance
% f17. Difference entropy
% f18. Information measures of correlation (1)
% f19. Information measures of correlation (2)
% f20. Maximal correlation coefficient
% f21. Inverse difference normalized (INN)
% f22. Inverse difference moment normalized (IDN)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -