使用 numpy 查找线段的中位数

问题描述 投票:0回答:1

我想找出图像中每个片段的中值。 第一步是做分割。我使用 skimage.segmentation 作为 follows.

然而返回掩码的大小是

100*100
而不是
100*100*3
。 我想使用 numpy func 来获取每个段的中位数,如this example.

有没有简单的方法让它工作?

from skimage.segmentation import felzenszwalb, slic, quickshift, watershed

np.random.seed(seed=777)
img = np.random.randint(low=0, high = 255, size=(100,100, 3))

segments_fz = felzenszwalb(img, scale=100, sigma=0.5, min_size=50)
label_image, num = label(segments_fz, return_num = True)
for i in num: 
    mask_arr = np.ma.masked_array(img, mask = ??? )
    out_arr1 = ma.median(mask_arr, axis = 0) 
python numpy image-segmentation scikit-image
1个回答
1
投票

据我所知,这里没有理由使用

np.ma.masked_array
。您应该改为使用 boolean indexing,这是 numpy 中非常强大的工具。考虑以下代码

import numpy as np

image = np.random.randint(low=0, high=255, size=(100,100,3))
mask = np.random.randint(low=0, high = 10, size=(100,100))

for i in range(10):
    median_for_i  = image[(mask == i)].mean()

mask==i
的结果是一个与
mask
相同形状的布尔数组,条件为真时值为
True
,其他地方为
False
。然后我们使用该布尔掩码来索引图像。
image[mask==i]
将返回一个仅包含由
image
选择的
mask
值的数组。我们用于索引的 2 个维度(形状
(100,100)
)将被展平为一个维度。

image
的形状为
(100,100,3)
mask
的形状为
(100,100)
没有问题。我们只索引前两个维度,保留最后一个。如果
n
中有
mask
个像素,其值为
i
image[mask==i]
的形状为
(n,3)

© www.soinside.com 2019 - 2024. All rights reserved.