仅使用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
----------------------------------------