根据存储在不同 ndarray 中的组在 ndarray 中找到 R、G、B 的最大值

Find the maximum of R,G,B in a ndarray according to their group stored in a different ndarray

我目前正在使用包 skimage.segmentation.

进行图像超像素 SLIC 分割

我的原图是3042*4032 (12Mpx)。在 skimage 中,数组的形状是 (3042,4023,3)。分割后,我在 3042*4032 数组中表示了大约 3000 个超像素。

我的目标是为每个超像素找到在红色通道、蓝色通道和绿色通道上具有最大值的像素的比例

我已经有一个函数可以给我整个图像中最大值的索引:

def proportion_majoritaire_rgb_image(img):
    """ In a pixel, which channel [R,G,B] has the maximum value ?

    :param img: image (N,m) skimage rgb
    :return: (N,m) array with indexes [0,1,2]
    """

    return np.argmax(img, axis=2)

并且通过过滤单个标签上的图像,我可以得到单个标签中最大RGB的比例:

def proportion_majoritaire_rgb_label(img, matrice_label):
    """ 
    :param img: image (N,m) skimage rgb
    :param matrice_label: ndarray (N,m) labels SLIC
    :return: (K, 3) array of K labels and 3 proportions
    """

    indice_max_rgb = proportion_majoritaire_rgb_image(img)

    n_pixel_max_rgb = []

for k in np.unique(image_grains_ble_slic).flat:
    label_data = indice_max_rgb[matrice_label == k]
    n_pixel_max_rgb.append(np.unique(label_data, return_counts=True)[1] / np.shape(label_data)[0])

    return n_pixel_max_rgb

问题是如何在没有这个 for 循环的情况下获取我所有 3000 个标签的信息?计算时间太长,有没有其他办法?

最终输出应该是一个带有 K 个标签的 ndarray (K,3) 并且对于每个通道 RGB 具有最大值的像素的比例。

提前致谢!

编辑:使用 np.unique(image_grains_ble_slic).flat 作为循环的迭代器似乎更快,但我避免 for 循环的目标仍然成立

由于long-standing feature request for skimage.measure.regionprops to allow measuring multichannel images. But, we can hack it together with some repeated calls to regionprops_table,它给了我们向量化的输出,所以有点老套:

from skimage import measure

index_max_rgb = np.argmax(image, axis=2)
max_index_images = [
    (index_max_rgb == i).astype(float) for i in range(3)
]
proportions_per_channel = [
    measure.regionprops_table(
        image_grains_ble_slic,
        intensity_image=intensity,
        properties=('mean_intensity',),
    )['mean_intensity']
    for intensity in max_index_images
]
proportions = np.stack(proportions, axis=1)

顺便说一句,请务必将 start_label=1 与 SLIC 一起使用,因为 regionprops 会忽略属于背景的 0 标签。