将图像裁剪到对象区域的区域

Cropping Image to Object Region's Area

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

如果背景像素具有恒定强度值,假设 0,您可以使用 or 中提出的任何方法。请注意,这些方法会产生近似的 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]]