Hi all, I was using until now Matlab and its about time for me to move to scikit-image as it provide me more flexibility and a lot of benefits. Normally, I used Matlab to calculate the properties of gray-level co-occurrence matrix as shown in this link ( http://www.mathworks.co.uk/help/images/ref/graycoprops.html) mainly with this simple script: clc; Img = imread('C:\Users\dell\Desktop\ImgTemp\python.jpg'); I=rgb2gray(Img); % Photo downloaded from “http://i425.photobucket.com/albums/pp337/jewarmy/python.jpg” GLCM2 = graycomatrix(I); allst = graycoprops(GLCM2,'all'); contrastInfo = allst.Contrast; display(contrastInfo) energyInfo = allst.Energy; display(energyInfo) homogeneityInfo = allst.Homogeneity; display(homogeneityInfo) correlationInfo = allst.Correlation; display(correlationInfo) With the following output: contrastInfo = 0.2516 energyInfo = 0.1094 homogeneityInfo = 0.8959 correlationInfo = 0.9672 While I was trying to do it with scikit-image using this script: import numpy as np from skimage.io import imread from skimage.feature import greycomatrix, greycoprops image=imread('C:/Users/dell/Desktop/ImgTemp/python.jpg', as_grey=True) g = greycomatrix(image, [0, 1], [0, np.pi/2], levels=256) contrast = greycoprops(g, 'contrast') print('contrast is: ', contrast) energy = greycoprops(g, 'energy') print('energy is: ', energy) homogeneity = greycoprops(g, 'homogeneity') print('homogeneity is: ', homogeneity) correlation = greycoprops(g, 'correlation') print('correlation is: ', correlation) dissimilarity = greycoprops(g, 'dissimilarity') print('dissimilarity is: ', dissimilarity) ASM = greycoprops(g, 'ASM') print('ASM is: ', ASM) I get these results: contrast is: [[0 0] [0 0]] energy is: [[ 40007.37212065 40007.37212065] [ 38525.88698525 38017.06358992]] homogeneity is: [[ 165440. 165440.] [ 165088. 164970.]] correlation is: [[ 1. 1.] [ 1. 1.]] dissimilarity is: [[0 0] [0 0]] ASM is: [[1600589824 1600589824] [1484243968 1445297124]] I do not understand why there are differences and for sure I miss something. Can someone please explain me what is wrong (I am using python 3.2 and scikit-image 0.8.3). Thanks a lot in advance.
I don't have matlab, so I can't say for sure what is going on. I can see a number of potential reasons for discrepancy. 1. There may be a slight difference between the RGB to grayscale conversion formulas used by matlab and skimage. It you want identical results, you'll have to confirm this. 2. Based on the matlab documentation, it looks like the image is quantized based on the NumLevels parameter. The default is 8. Once again, in order to get the same results, you'll need to make sure this scaling is the same. 3. It looks like matlab normalizes the GLCM matrix (although the docs don't say). 4. By default, it looks like matlab only computes the GLCM for one offset. Also, there is a difference between the way the offsets are specified: skimage defines the offset by distance & angle, while matlab specifies it by row and column offset. The following doesn't give the same answer at matlab, but they are in the right ballpark: import skimage.io import skimage.feature im = skimage.io.imread('python.jpg', as_grey=True) im = skimage.img_as_ubyte(im) im /= 32 g = skimage.feature.greycomatrix(im, [1], [0], levels=8, symmetric=False, normed=True) print skimage.feature.greycoprops(g, 'contrast')[0][0] print skimage.feature.greycoprops(g, 'energy')[0][0] print skimage.feature.greycoprops(g, 'homogeneity')[0][0] print skimage.feature.greycoprops(g, 'correlation')[0][0] with the results: 0.301505863539 0.29090192313 0.883493603794 0.971610338356 To dig deeper I would need matlab. However, hopefully this is enough to get you started. You might want to try some simple/small images, and look at the actual GLCM matrices. Neil On Sunday, 7 July 2013 00:42:38 UTC+1, ely...@mail.com wrote:
Hi all,
I was using until now Matlab and its about time for me to move to scikit-image as it provide me more flexibility and a lot of benefits.
Normally, I used Matlab to calculate the properties of gray-level co-occurrence matrix as shown in this link ( http://www.mathworks.co.uk/help/images/ref/graycoprops.html) mainly with this simple script:
clc;
Img = imread('C:\Users\dell\Desktop\ImgTemp\python.jpg');
I=rgb2gray(Img);
% Photo downloaded from “ http://i425.photobucket.com/albums/pp337/jewarmy/python.jpg”
GLCM2 = graycomatrix(I);
allst = graycoprops(GLCM2,'all');
contrastInfo = allst.Contrast;
display(contrastInfo)
energyInfo = allst.Energy;
display(energyInfo)
homogeneityInfo = allst.Homogeneity;
display(homogeneityInfo)
correlationInfo = allst.Correlation;
display(correlationInfo)
With the following output:
contrastInfo =
0.2516
energyInfo =
0.1094
homogeneityInfo =
0.8959
correlationInfo =
0.9672
While I was trying to do it with scikit-image using this script:
import numpy as np
from skimage.io import imread
from skimage.feature import greycomatrix, greycoprops
image=imread('C:/Users/dell/Desktop/ImgTemp/python.jpg', as_grey=True)
g = greycomatrix(image, [0, 1], [0, np.pi/2], levels=256)
contrast = greycoprops(g, 'contrast')
print('contrast is: ', contrast)
energy = greycoprops(g, 'energy')
print('energy is: ', energy)
homogeneity = greycoprops(g, 'homogeneity')
print('homogeneity is: ', homogeneity)
correlation = greycoprops(g, 'correlation')
print('correlation is: ', correlation)
dissimilarity = greycoprops(g, 'dissimilarity')
print('dissimilarity is: ', dissimilarity)
ASM = greycoprops(g, 'ASM')
print('ASM is: ', ASM)
I get these results:
contrast is: [[0 0]
[0 0]]
energy is: [[ 40007.37212065 40007.37212065]
[ 38525.88698525 38017.06358992]]
homogeneity is: [[ 165440. 165440.]
[ 165088. 164970.]]
correlation is: [[ 1. 1.]
[ 1. 1.]]
dissimilarity is: [[0 0]
[0 0]]
ASM is: [[1600589824 1600589824]
[1484243968 1445297124]]
I do not understand why there are differences and for sure I miss something. Can someone please explain me what is wrong (I am using python 3.2 and scikit-image 0.8.3).
Thanks a lot in advance.
On Mon, Jul 8, 2013 at 9:56 AM, Neil <yager.neil@gmail.com> wrote:
1. There may be a slight difference between the RGB to grayscale conversion formulas used by matlab and skimage. It you want identical results, you'll have to confirm this.
That's true. The Matlab conversion is probably done as follows: image = np.uint8(0.2989 * python[..., 0] + 0.5870 * python[..., 1] + 0.1140 * python[..., 2]) I'm not sure whether they round or discard the fraction.
3. It looks like matlab normalizes the GLCM matrix (although the docs don't say).
This should probably raise a warning in graycoprops--it doesn't make much sense to calculate these without normalization. Stéfan
participants (3)
-
elyraz@mail.com
-
Neil
-
Stéfan van der Walt