如何解决如何计算只有一些像素的灰度共生矩阵?
我想计算 skimage.feature.texture.greycomatrix()
。现在,我使用以下参数进行了尝试:
skimage.feature.texture.greycomatrix(image,[1],[0],levels=256,symmetric=False,normed=False)
但是,我想要做的是只用一些像素来计算这个矩阵。
我有这个面具:
而且,我有这张图片:
objects in an array are always references
而且,我只想计算白色蒙版和图片之间的交叉像素。我不想用黑色像素或其他剩余元素来计算蒙版,只用图像的像素与蒙版的白色区域相交,如下所示:
我该怎么做?
解决方法
仅使用 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,1,1],[0,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',: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,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
----------------------------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。