Если фоновые пиксели имеют постоянное значение интенсивности, скажем, 0
, вы можете использовать любой из методов, предложенных в Использование скимаджа для непрямоугольных областей изображения или Python: взятие GLCM непрямоугольной области . Обратите внимание, что эти методы дают приблизительный GLCM, так как пиксели изображения с тем же уровнем интенсивности, что и фоновые пиксели, отбрасываются из совместного анализа.
Если вы хотите вычислить все совместные вхождения в интересующей области, не отбрасывая ни одного пикселя внутри области интереса, следующий фрагмент может поставить вас на правильный путь:
import numpy as np
from skimage import io, color, util
from skimage.feature.texture import greycoprops
import matplotlib.pyplot as plt
def glcm_roi(img, mask, dh=1, dv =0, levels=256):
glcm = np.zeros(shape=(levels, levels), dtype=np.int_)
for i in range(img.shape[0] - dv):
for j in range(img.shape[1] - dh):
if mask[i, j] and mask[i + dv, j + dh]:
glcm[img[i, j], img[i + dv, j + dv]] += 1
return glcm/glcm.sum()
arr = io.imread('https://i.stack.imgur.com/q6cpu.png')
mask = arr[:, :, -1] > 0
img = util.img_as_ubyte(color.rgb2gray(arr[:, :, :-1]))
glcm = glcm_roi(img, mask)
energy = greycoprops(glcm[:, :, None, None], 'energy')
print('Energy = {}'.format(energy))
fig, ax = plt.subplots(1, 3)
ax[0].imshow(arr)
ax[0].set_title('RGB')
ax[1].imshow(img, cmap='gray')
ax[1].set_title('Gray')
ax[2].imshow(mask, cmap='gray')
ax[2].set(title='Mask')
for axi in ax: axi.set_axis_off()
plt.show(fig)
Выход:
[[0.15203625]]
![Results](https://i.stack.imgur.com/4KpwK.png)