Python 用于GLCM计算和窗口大小的Mahotas库

Python 用于GLCM计算和窗口大小的Mahotas库,python,computer-vision,scikit-image,mahotas,glcm,Python,Computer Vision,Scikit Image,Mahotas,Glcm,我正在使用mahotas库对卫星图像(250 x 200像素)进行纹理分析(GLCM)。GLCM计算在窗口大小内进行。所以,对于滑动窗口的两个相邻位置,我们需要从头开始计算两个共现矩阵。我已经读到,我可以设置步长,以避免计算重叠区域的GLCM。我提供了下面的代码 #Compute haralick features def haralick_feature(image): haralick = mahotas.features.haralick(image, True) retu

我正在使用mahotas库对卫星图像(250 x 200像素)进行纹理分析(GLCM)。GLCM计算在窗口大小内进行。所以,对于滑动窗口的两个相邻位置,我们需要从头开始计算两个共现矩阵。我已经读到,我可以设置步长,以避免计算重叠区域的GLCM。我提供了下面的代码

#Compute haralick features
def haralick_feature(image):
    haralick = mahotas.features.haralick(image, True)
    return haralick


img = 'SAR_image.tif'
win_s=32 #window size
step=32 #step size

rows = img.shape[0]
cols = img.shape[1]
array = np.zeros((rows,cols), dtype= object)
harList = []

for i in range(0, rows-win_s-1, step):
        print 'Row number: ', r
    for j in range(0, cols-win_s-1, step):
        harList.append(haralick_feature(image))

harImages = np.array(harList)     
harImages_mean = harImages.mean(axis=1)
对于上面的代码,我已经将窗口和步长设置为32。代码完成后,我得到一个尺寸为6x8(而不是250x200)的图像,这是有意义的,因为步长已设置为32

因此,我的问题是:通过设置步长(以避免重叠区域中的计算以及代码变得更快),我是否可以以某种方式为整个图像导出尺寸为250 x 200的GLCM结果,而不是其子集(6 x 8维)?或者我别无选择,只能以正常方式(不设置步长)在图像上循环?

您无法使用,因为此库中没有计算共现贴图的函数。从GLCM中提取纹理特征的另一种方法是利用(查看详细信息)

但是如果你想坚持使用mahotas,你应该尝试使用滑动窗口,而不是滑动窗口,因为它可以加快图像的扫描速度。请务必阅读文档末尾关于内存使用的警告。如果使用
view\u as\u windows
对您来说是一种负担得起的方法,那么以下代码可以完成这项工作:

将numpy导入为np
从skimage导入io,util
将mahotas.features.texture作为mht导入
def haralick_功能(img、win、d):
win_sz=2*win+1
窗口形状=(win_sz,win_sz)
arr=np.pad(img,win,mode='reflect')
视窗=util.视窗为视窗(arr,视窗形状)
Nd=len(d)
feats=np.zeros(shape=windows.shape[:2]+(Nd,4,13),dtype=np.float64)
对于xrange中的m(windows.shape[0]):
对于xrange中的n(windows.shape[1]):
对于枚举(d)中的i,di:
w=窗口[m,n,:,:]
专长[m,n,i,:,:]=mht.haralick(w,距离=di)
返回专长。重塑(专长。形状[:2]+(-1,))

演示

对于下面的示例运行,我将
win
设置为
19
,它对应于一个形状窗口
(39,39)
。我考虑过两种不同的距离。请注意,
mht.haralick
为四个方向生成13个GLCM特性。总的来说,这将导致每个像素的104维特征向量。当应用于从陆地卫星图像裁剪的
(250200)
像素时,特征提取大约在7分钟内完成

[171]中的
:img=io.imread('landsat_crop.tif'))
In[172]:img.shape
Out[172]:(250L,200L)
In[173]:win=19
在[174]中:d=(1,2)
在[175]中:%time feature\u map=haralick\u features(img,win,d)
墙壁时间:7分钟4秒
在[176]中:特征映射形状
输出[176]:(250L、200L、104L)
在[177]中:特征映射[0,0,:]
出[177]:
阵列([8.19278030e-03,1.30863698e+01,7.64234582e-01。。。,
3.59561817e+00,-1.35383606e-01,8.32570045e-01])
In[178]:io.imshow(img)
出[178]:

您的代码示例很可能不完整:您总是使用相同的参数来
haralick\u feature
Hi Luispedro,您可能是对的,我可能没有在这里粘贴一些代码。我创建了这个脚本的几个不同版本(所有脚本都很好),试图解决如何获得整个图像的GLCM结果(设置步长时),而不是它的一个小主题。如果我没有设置步长,这个过程非常耗时。谢谢你的详细回答。我很感激。