如何使用skimage.measure.regionprops查询标签

时间:2019-04-15 15:06:59

标签: python scikit-image

有人可以帮我解决skimage.measure.regionprops吗?该文档在描述regionprops提供的属性列表时使我感到困惑。

我想执行以下操作:

  • 查询点(x,y),并返回该点所属的标记区域。
  • 获取标记区域内所有点的ndarray。

下面是一些代码,显示了我到目前为止的情况:

import numpy as np
from skimage.measure import label
import matplotlib.pyplot as plt

arr = np.array([[1, 0, 1, 0, 0, 0, 1],
                [1, 1, 1, 0, 0, 0, 1],
                [0, 1, 1, 0, 0, 0, 1],
                [0, 1, 1, 0, 0, 1, 1],
                [0, 0, 0, 0, 1, 1, 1],
                [0, 0, 0, 1, 1, 1, 1],
                [1, 0, 0, 1, 1, 1, 1],
                [1, 0, 0, 1, 1, 1, 1],
                [1, 0, 0, 1, 1, 1, 1]])

img = label(arr)
plt.imshow(img)
plt.show()

我想做的例子是查询arr[8][6]并知道它是哪个标签(绿色)的一部分,并知道属于任意标签的所有点(例如绿色)。

1 个答案:

答案 0 :(得分:3)

可以通过索引img来检索任何像素的数字标签:

In [67]: row, col = 8, 6

In [68]: index = img[row, col]

In [69]: print(f'The label of pixel [{row}, {col}] is {index}')
The label of pixel [8, 6] is 2

您可以使用NumPy的nonzero获取具有相同标签的所有像素的坐标:

In [70]: coords = np.nonzero(img == index)

In [71]: coords
Out[71]: 
(array([0, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8], dtype=int32),
 array([6, 6, 6, 5, 6, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 6, 3, 4, 5, 6], dtype=int32))

In [72]: out = np.zeros(shape = arr.shape + (3,), dtype=np.uint8)

In [73]: out[coords] = [0, 255, 0]    # green

In [74]: plt.imshow(out)
Out[74]: <matplotlib.image.AxesImage at 0x11a2ec10>

green region