1

我打算将纹理识别应用于不同的花卉图片,并且正在考虑使用 GLCM 进行特征提取。在应用 GLCM 之前,我应该将 RGB 图像转换为灰色图像。我还想从灰色图像中减去背景信息,以仅应用 GLCM 花卉对象的像素来消除噪声。我正在考虑使用skimage。如何从灰色图像中减去背景像素以确保大多数像素属于花卉对象?

4

1 回答 1

1

如果背景像素具有恒定的强度值,比方说0,您可以使用将 skimage 用于非矩形图像区域Python:采用非矩形区域的 GLCM 中提出的任何方法。请注意,这些方法会产生一个近似的 GLCM,因为与背景像素具有相同强度级别的图像像素从共现分析中被丢弃。

如果您想计算感兴趣区域上的所有共现而不丢弃 ROI 内的任何像素,以下代码段可能会让您走上正确的轨道:

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]]

结果

于 2018-11-03T14:02:19.487 回答