【问题标题】:Calculating the co-occurrence matrix of part of an image from a mask从掩码计算部分图像的共现矩阵
【发布时间】:2018-05-15 10:32:19
【问题描述】:

我有以下代码,我试图在其中获取与给定蒙版对应的图像的一部分。然后我想在该部分应用 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]]

有什么办法可以完成这项工作吗?

谢谢!

【问题讨论】:

  • 使用掩码索引一个 numpy 数组会返回一个线性数组。如果你仔细想想,这并不奇怪。如果a = [[1, 2], [3, 4]],并且您有一个掩码b = [[1, 0], [1, 1]],则结果为a[b] = [1, 3, 4]。所以它不是二维数组。如果每行上有不同数量的屏蔽元素,它就不能返回二维数组,所以它永远不会。但是,如果您只想将遮罩外的所有内容设置为黑色,您可以使用 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]]),它是二维的。

标签: python opencv mask scikit-image glcm


【解决方案1】:

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

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

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

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

到:

mancha = cruda.copy()
mancha[mancha == 0] = 1
mancha[~imaskc] = 0
glcm = greycomatrix(mancha, [2], [0], levels=None, symmetric=True, normed=True)[1:, 1:, :, :]

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 2017-05-30
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多