How to normalize GLCMs created for four offsets?

I am using Matlab 2019b to extract texture features of images using gray level co-occurrence matrix (glcm). I have written the following code to extract rotation invariant features with directions 0, 45, 90, 135. The code creates four glcms and every feature has four values; one per direction.
I = imread('test.jpg')
offsets = [0 1; -1 1;-1 0;-1 -1];
glcm = graycomatrix(I, 'GrayLimits', [], 'Offset',offsets);
stats = graycoprops(glcm);
I want to normalize the glcms then extract each feature from the normalized glcms.
Any help is greatly appreciated.

2 Comments

Not sure what you want. Do you just want this
glcm = glcm / sum(glcm(:));
or
glcm = glcm / max(glcm(:));
or
glcm = rescale(glcm, 0, 1);
Thank you Image Analyst for your quick reply.
Actually some papers used normalized and unnormalized glcms for texture analysis and showed that normalized glcm outperformed unnormalized glcm. So I want to practise both and compare the result.
I was able to normalize glcms created for each direction (0, 45, 90, 135) but when I pass the resultant glcms to the function graycoprops, it produces error saying 'Expected input number 1, GLCM, to be integer-valued'.
This is the code I used:
offsets = [0 1; -1 1;-1 0;-1 -1];
glcm1 = graycomatrix(rgb2gray(mskRgbImg), 'GrayLimits', [], 'Offset',offsets);
size_glcm_3 = size(glcm1,3);
for k = 1:size_glcm_3
glcm_sum(k) = sum(sum(glcm1(:,:,k)));
glcm(:,:,k) = glcm1(:,:,k)./glcm_sum(k); % Normalize each glcm
end
stats = graycoprops(glcm);
Help me please!

Sign in to comment.

Answers (2)

Regarding your last comment above . . .It told you it's not integer and it needs integer. So, cast it to integer:
uint8Image = uint8(rescale(rgb2gray(mskRgbImg), 0, 255));
Then pass that into graycomatrix().
See my attached glcm demo.

3 Comments

Thank you Image Analyst for your answer.
Actually the input image for the glcm is type uint8 already but the problem is with graycoprops() function which does not accept normalized glcms. If I give unnormalized glcms to the graycoprops() function, no error is produced but when I give normalized glcms to the graycoprops() function, it produces error.
In the code above, first I create the glcms (glcm1) then normalize each glcm using a for loop. After that, I give the normalized glcms as input to the graycoprops() function. Here, graycoprops() function throws an error saying the input is not an integer.
The following image shows the unnormalized and normalized glcms.
So don't normalize it. Why do you think each should be normalized? If each is normalized independently then how can you compare them?
Based on literature review which I have done, some papers used normalized and unnormalized glcms and compared the results of classification using these glcms. Therefore, I wanted to use normalized and unnormalized glcms for texture features extraction and compare the results of classification using each of these glcms.
The following file normalized each glcm but calculated texture features using equations not via graycoprops() function.
Thanks

Sign in to comment.

Hend Abouche
Hend Abouche on 8 Apr 2022
Edited: Image Analyst on 8 Apr 2022
Hello, I am working on texture features extraction and I want to ask you why you didn't use just the function graycomatrix in a simple way, but you used the offset. Did you do it so you can specify the pixels that you want to calculate their co-occurrence?

5 Comments

The default says to only consider the pixel to the right of the moving pixel. Doing that, you'll never learn if there is any pattern in the vertical direction. If you specify more directions then it looks at the values all around the moving pixel, like the average texture in all directions. You only need to do 4 of the 8 because you'll pick up the "unused" pairs once the pixel moved to the line below. For example if you're at column 10, row 5, if you looked at all 8 angles, then when you're on row 5 you'll get the pair of pixels at column 10 at rows 5 and 6 (which is below the pixel). But then when you get to the row below, 6, if you looked all around, you'll get the pair of pixels in rows 5 and 6 again (which is above the current pixel). So there is no need to spend the time to consider the same pair of pixels twice, so you just look at 4 directions, instead of all 8.
Thank u so much for this answer, I really got the idea, and plz I have one more question what is the use of graylimits and Numlevels?, cuz we already convert the rgb image to gray before passing it to graycomatrix function
I think it's similar to using different numbers of bins in a histogram. Maybe you want fewer, maybe you want more. Personally I just use as many levels as there are gray levels, like 256 if the image is uint8.
So I did, thank you so much for ur time
Hi @Image Analyst, i have a question in the same context, what's the difference between using symmetric and not (set it to false or true), i know how it works but in term of results which is better and what does it give or add as an information ?

Sign in to comment.

Products

Release

R2019b

Asked:

on 22 Mar 2020

Commented:

on 23 Jun 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!