【问题标题】:How to calculate the grey-level co-occurrence matrix with only some pixels?如何计算只有一些像素的灰度共生矩阵?
【发布时间】:2021-07-24 12:20:32
【问题描述】:

我想计算skimage.feature.texture.greycomatrix()。现在,我尝试了以下参数:

skimage.feature.texture.greycomatrix(image, [1], [0], levels=256, symmetric=False, normed=False)

但是,我想做的是只用一些像素来计算这个矩阵。

我有这个面具:

而且,我有这张图片:

而且,我只想计算白色蒙版和图片之间的交叉像素。我不想计算带有黑色像素或其他剩余元素的蒙版,只计算与蒙版的白色区域相交的图像像素,如下所示:

我该怎么做?

【问题讨论】:

    标签: python image image-processing scikit-image


    【解决方案1】:

    仅使用skimage.measure.greycomatrix,我认为您无法实现,因为没有mask 参数或类似参数。所以,我想,你需要在这里自己构建一些东西。

    我的想法是将所有不需要的像素设置为-1,获得与(x, y) 偏移相关的所需对应关系,过滤掉所有包含至少一个-1 条目的像素,并计算所有剩余像素的出现次数信件。这样,您将忽略所有包含掩码外像素的对应关系。

    举一个简单的例子(参见skimage.measure.greycomatrix中的first example):

    import numpy as np
    
    # https://scikit-image.org/docs/dev/api/skimage.feature.html#greycomatrix
    image = np.array([[0, 0, 1, 1],
                      [0, 0, 1, 1],
                      [0, 2, 2, 2],
                      [2, 2, 3, 3]], dtype=np.uint8)
    h, w = image.shape
    
    # Set offset and levels (assuming range [0 ... max] here)
    x_off, y_off = (1, 0)
    levels = np.max(image) + 1
    
    # Temporary matrix
    temp = -np.ones((h+y_off, w+x_off), int)
    temp[:h, :w] = image
    temp = temp[y_off:, x_off:]
    
    # Get correspondences
    temp = np.vstack([image.flatten(), temp.flatten()]).T
    
    # Filter correspondences with at least one entry -1, and count correspondences
    temp = temp[~np.any(temp == -1, axis=1), :]
    temp = np.unique(temp, axis=0, return_counts=True)
    
    # Create GLCM
    glcm = np.zeros((levels, levels), int)
    glcm[temp[0][:, 0], temp[0][:, 1]] = temp[1]
    print(glcm)
    # [[2 2 1 0]
    #  [0 2 0 0]
    #  [0 0 3 1]
    #  [0 0 0 1]]
    

    这与skimage.measure.greycomatrix的结果一致。

    对于您的实际图像和蒙版,这将是完整代码(抱歉在这里使用 OpenCV;对我来说,原型制作速度更快):

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Read image and mask
    image = cv2.imread('us.png', cv2.IMREAD_GRAYSCALE)[:857, :1211]
    mask = cv2.imread('mask.png', cv2.IMREAD_GRAYSCALE)[:857, :1211]
    
    # Get bounding rectangle, crop image and mask
    x, y, w, h = cv2.boundingRect(mask)
    image = image[y:y+h, x:x+w]
    mask = mask[y:y+h, x:x+w]
    
    # DEBUG: Count non-zero pixels of mask
    print('# non-zero pixels mask:', cv2.countNonZero(mask))
    
    # Set all non-masked pixels in image to -1
    image = image.astype(int)
    image[~mask.astype(bool)] = -1
    h, w = image.shape
    
    # Set offset and levels (assuming range [0 ... max] here)
    x_off, y_off = (1, 0)
    levels = np.max(image) + 1
    
    # Temporary matrix
    temp = -np.ones((h+y_off, w+x_off), int)
    temp[:h, :w] = image
    temp = temp[y_off:, x_off:]
    
    # Get correspondences
    temp = np.vstack([image.flatten(), temp.flatten()]).T
    
    # Filter correspondences with at least one entry -1, and count correspondences
    temp = temp[~np.any(temp == -1, axis=1), :]
    temp = np.unique(temp, axis=0, return_counts=True)
    
    # Create GLCM
    glcm = np.zeros((levels, levels), int)
    glcm[temp[0][:, 0], temp[0][:, 1]] = temp[1]
    
    # DEBUG: Count number of correspondences found in GLCM
    print('# correspondences found in GLCM:', np.sum(glcm))
    
    # Some visualization
    plt.figure(1, figsize=(8, 8))
    plt.imshow(glcm, cmap='hot'), plt.colorbar()
    plt.tight_layout(), plt.show()
    

    GLCM 对print 来说太大了,所以情节:

    让我们看看额外的DEBUG 输出:

    # non-zero pixels mask: 18636
    # correspondences found in GLCM: 18259
    

    您的蒙版中有 18,636 个非零像素,但 GLCM 中只计算了 18,259 个对应关系。这些像素我没有算过忽略的,但是对于(1, 0)的偏移量,400的差异似乎是合理的。

    ----------------------------------------
    System information
    ----------------------------------------
    Platform:      Windows-10-10.0.16299-SP0
    Python:        3.9.1
    PyCharm:       2021.1.1
    Matplotlib:    3.4.1
    NumPy:         1.20.2
    OpenCV:        4.5.1
    ----------------------------------------
    

    【讨论】:

    • 非常感谢!!!这真太了不起了!!因此,我将获得带有白色蒙版覆盖部分纹理的矩阵,对吗?如果读取我使用的图像可以吗: image = np.array(image) image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)[:857, :1211]
    • 为了阅读我使用的面具: mask = mask[:857, :1211] ?这是我不会出错的唯一方法
    • 最后一个问题,对于这个矩阵,我正在尝试使用 skimage.feature.texture.greycoprops(glcm, prop='contrast') 但我有这个错误: ValueError: The parameter P must是一个 4 维数组,因为 glcm 对我来说是 174 x 174。这怎么可能?
    • (174, 174) 抱歉。我之前的 P 是:(256, 256, 1, 1)
    • 非常感谢!!如果您需要更多信息,我可以修改问题。
    猜你喜欢
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多