Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从掩模计算部分图像的共生矩阵_Python_Opencv_Mask_Scikit Image_Glcm - Fatal编程技术网

Python 从掩模计算部分图像的共生矩阵

Python 从掩模计算部分图像的共生矩阵,python,opencv,mask,scikit-image,glcm,Python,Opencv,Mask,Scikit Image,Glcm,我有下面的代码,在其中我试图得到一部分图像对应于一个面具我给。然后,我想对该部分应用skimage.feature.glcm。但我得到了一个错误: glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric = True, normed = True) File "D:\WinPython-64bit-2.7.13.1ZeroNew\python-2.7.13.amd64\lib\site-packages\skimage\featu

我有下面的代码,在其中我试图得到一部分图像对应于一个面具我给。然后,我想对该部分应用skimage.feature.glcm。但我得到了一个错误:

glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric = True, normed = True)
File "D:\WinPython-64bit-2.7.13.1ZeroNew\python-2.7.13.amd64\lib\site-packages\skimage\feature\texture.py", line 101, in greycomatrix
assert_nD(image, 2)
File "D:\WinPython-64bit-2.7.13.1ZeroNew\python-2.7.13.amd64\lib\site-packages\skimage\_shared\utils.py", line 178, in assert_nD
raise ValueError(msg_incorrect_dim % (arg_name, '-or-'.join([str(n) for n in ndim])))
ValueError: The parameter `image` must be a 2-dimensional array
代码是:

mask = cv2.imread(pathMask, 0)
cruda = cv2.imread(pathCruda, 0)
imaskc = mask > 0
mancha = cruda[imaskc]

glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric = True, normed = True)
energy = greycoprops(glcm, 'energy')
homogeneity = greycoprops(glcm, 'homogeneity')
我还尝试了以下方面,但均未成功:

labeled_image, nb_labels = ndimage.label(mascara)
blobs = ndimage.find_objects(labeled_image)

glcm = greycomatrix(cruda[blobs[0]]
你知道怎么做吗


谢谢

您不能直接将蒙版图像传递给
greycomatrix
。好消息是,通过在代码中引入小的更改,可以计算从图像感兴趣区域提取的Haralick特征的近似值

其基本思想是保存一个灰度级,例如
0
,以标记那些位于感兴趣区域(ROI)之外的图像像素。要使此方法正常工作,您需要将原始强度为
0
的ROI内像素的强度更改为不同(但类似)的值,例如
1
。请注意,以这种方式修改图像不可避免地会在共生矩阵中引入不精确性,但只要图像足够大并且具有平滑的直方图,就可以安全地假设获得的特征非常接近精确值。还需要注意的是,为了不考虑用于标记非ROI像素的灰度,必须去掉共现矩阵的第0行和第0列

要实现上述解决方法,只需更改以下两行:

mancha = cruda[imaskc]
glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric=True, normed=True)
致:


使用掩码索引numpy数组将返回一个线性数组。如果你仔细想想,这并不奇怪。如果
a=[[1,2],[3,4]]
,并且您有一个掩码
b=[[1,0],[1,1]
,则结果
a[b]=[1,3,4]
。所以它不是一个二维数组。如果每行上有不同数量的屏蔽元素,它就不能返回2D数组,所以它永远不会返回。但是,如果您只想将遮罩外的所有内容设置为黑色,则可以使用
cruda[~imaskc]=0轻松完成。谢谢您的回答,但我想做的是获取图像的部分,以便我可以将其传递给glcm函数。请考虑您在此处实际需要的内容。看看我上面的例子,其中1是
True
,0是
False
。在那个例子中,
a[b]
的返回应该是什么样子?对不起,我真的不明白你的意思。你刚才说的a[b]=[1,2,3]的返回值正好…这个数组有多少维?就一个
glcm
需要二维输入。使用掩码索引只会线性地给出与掩码对应的所有元素。换句话说:如果
a=np.array([[1,2],[3,4]])
b=np.array([[1,0],[1,1]])
那么
a[b]=np.array([1,3,4])
但是你可能想要的是
a[~b]=0
,这样
a=np array([[1,0],[3,4]])
,这是二维的。
mancha = cruda.copy()
mancha[mancha == 0] = 1
mancha[~imaskc] = 0
glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric=True, normed=True)[1:, 1:, :, :]