Some hints for the mandatory assignment one
I have received some feedback that it is hard to understand what you are supposed to do in the first mandatory assignment. So here are some hints on what you are supposed to do. I'm not going to solve the exercises but I'll try to provide some hints for you.
You have to keep in mind that the overall task in this exercise is to be able to autmatically segment each texture from the other textures. This means that the answer to the question what is a good direction/good feature is a direction/feature that will help you segment the textures.
This part is just to look at the 8 different textures and by your own judgement describe how the features differ. Relevant keywords are listed in the assignment. So forexample saying that the frequency in texture X is higher than texture Z is okay. But if you are able to figure out the actual quantitative frequency you are welcome to say so, but this is not necessary.
Here you should devide the images into subimages of each texture. You may also do different histogram transforms as a pre-prosessing step as I used the histogram equalization as a preprossing in the first weekly exercise.
You also should, based on you analysis in A, choose some paramteres you believe should help separating the textures.
Then you are to normalise the image (thus use fewer grayleves). How many graylevels do you need? And calculate the GLCM from each texture.
For example like this:
% Here I have chosen some other textures from http://www.cb.uu.se/~gustaf/texture/ clear all close all texture1 = imread('texture1.png'); texture2 = imread('texture2.png'); % My chosen number of graylevels G = 16; % My chosen direction dx = 2; dy = 0; %Normalizing the images texture1 = uint8(round(double(texture1) * (G-1) / double(max(texture1(:))))); texture2 = uint8(round(double(texture2) * (G-1) / double(max(texture2(:))))); %Lets make a mock texture3 texture3 = texture2; lim1 = 6; lim2 = 8; texture3(texture2>lim2) = 8; texture3((texture2>lim1)&(texture2<=lim2)) = 15; texture3(texture2<lim1) = 0; % Calculate the GLCM from each texture. Here I use the symmetric normalized % GLCM. The isotropic GLCM menitioned in the lecture is a GLCM where you % merge many GLCMs calulated for different directions. See the lecture % slides for more detail. P1 = GLCM(texture1,G,dx,dy,1,1); P2 = GLCM(texture2,G,dx,dy,1,1); P3 = GLCM(texture3,G,dx,dy,1,1); % Plot the images and resulting GLCMs figure(1);clf imagesc(texture1) colormap gray title('Texture 1'); figure(2);clf imagesc(P1) colormap jet title('GLCM of texture 1'); figure(3);clf imagesc(texture2) colormap gray title('Texture 2'); figure(4);clf imagesc(P2) colormap jet title('GLCM of texture 3'); figure(5);clf imagesc(texture3) colormap gray title('Texture 3'); figure(6);clf imagesc(P3) colormap jet title('GLCM of texture 3');
In part C you are asked to use three different features. Let's investigate them a bit.
% Creating two matrices with the corresponding index. i = repmat((0:(G-1))', 1, G); j = repmat( 0:(G-1) , G, 1); %To understand the three different GLCM features, lets look at each of the %weighting %Intertia weighting inertia_weighting = (i-j).^2; %Homogenity (Inverse Difference Moment) idm_weighting = 1./(1+(i-j).^2); %Cluster shade weighting using mean from GLCM from texture 1 u_x_1 = sum(sum(P1 .* (i + 1))); u_y_1 = sum(sum(P1 .* (j + 1))); cs_weighting_1 = (i+j-u_x_1-u_y_1).^3; %Cluster shade weighting using mean from GLCM from texture 2 u_x_2 = sum(sum(P2 .* (i + 1))); u_y_2 = sum(sum(P2 .* (j + 1))); cs_weighting_2 = (i+j-u_x_2-u_y_2).^3; figure(7) imagesc(inertia_weighting) colorbar title('GLCM intertia weighting') %Lets calculate some values. What to they mean? text1_intertia = sum(sum(inertia_weighting.*P1)) text2_intertia = sum(sum(inertia_weighting.*P2)) text3_intertia = sum(sum(inertia_weighting.*P3)) figure(8) imagesc(idm_weighting) colorbar title('Homogenity weighting'); %Lets calculate some values. What to they mean? text1_idm = sum(sum(idm_weighting.*P1)) text2_idm = sum(sum(idm_weighting.*P2)) text3_idm = sum(sum(idm_weighting.*P3)) figure(9) imagesc(cs_weighting_1) colorbar title('Cluster shade weighting using means from P1'); figure(10) imagesc(cs_weighting_2) colorbar title('Cluster shade weighting using means from P2'); % I'll leave it for you to calculate some example values for the GLCM % cluster shade % So when looking at these weights, what will each of these features favour? % What kind of structure in the GLCM matrix will get what values??
text1_intertia = 5.1397 text2_intertia = 1.3622 text3_intertia = 24.7920 text1_idm = 0.4102 text2_idm = 0.6406 text3_idm = 0.6602
In part C you are supposed to calculate feature images. You do this by having a local window gliding over the entire image of the four textures and for each window you get one GLCM matrix which will give you one value for each feature.
% One feature image for one chosen GLCM direction can for example look like % this: load feature_img figure(11) imagesc(feature_img); colormap jet colorbar title('Example of a feature image');
Part D is to treshold the different feature images to try to segment each texture. post_id = 529; %delete this line to force new post; permaLink = http://inf4300.olemarius.net/2015/09/29/oblig1-m/;