我想找出图像中每个片段的中值。 第一步是做分割。我使用 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)
据我所知,这里没有理由使用
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)