确定numpy数组中的相邻区域

cf2*_*cf2 5 python arrays numpy neighbours region

我正在寻找以下内容.我有一个numpy数组,标记为区域.numpy数组表示分段图像.区域是具有相同值的多个相邻单元.每个地区都有自己独特的价值.具有3个区域的简化版本如下所示:

x = np.array([[1, 1, 1], [1, 1, 2], [2, 2, 2], [3, 3, 3]], np.int32)
Run Code Online (Sandbox Code Playgroud)

输出:

array([[1, 1, 1],
       [1, 1, 2],
       [2, 2, 2],
       [3, 3, 3]])
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们有3个独立的区域,每个区域都标有唯一值(在这种情况下为1,2,3).

我想要的是每个区域的相邻(邻居)区域的价值.所以在这种情况下:

  • 区域1与区域2相邻
  • 区域2与区域1和3相邻
  • 区域3与区域2相邻

实现这一目标最优雅,最快捷的方法是什么?

非常感谢!

小智 5

据我了解,任务是返回数组中与给定数字(例如 2)相邻的所有不同条目。使用 NumPy 方法实现此目的的一种方法是使用roll将给定区域向上、向下、向左和向右移动一个单位。对移位区域进行逻辑或,并返回与此条件匹配的所有不同元素。然后仍然需要删除该区域本身,因为它不被视为自己的邻居。

由于在roll两端重新引入超出数组边界的值(此处不需要),因此额外的步骤是用 False 替换该行或列。

import numpy as np

x = np.array([[1, 1, 1], [1, 1, 2], [2, 2, 2], [3, 3, 3]], np.int32)
region = 2   # number of region whose neighbors we want

y = x == region  # convert to Boolean

rolled = np.roll(y, 1, axis=0)          # shift down
rolled[0, :] = False             
z = np.logical_or(y, rolled)

rolled = np.roll(y, -1, axis=0)         # shift up 
rolled[-1, :] = False
z = np.logical_or(z, rolled)

rolled = np.roll(y, 1, axis=1)          # shift right
rolled[:, 0] = False
z = np.logical_or(z, rolled)

rolled = np.roll(y, -1, axis=1)         # shift left
rolled[:, -1] = False
z = np.logical_or(z, rolled)

neighbors = set(np.unique(np.extract(z, x))) - set([region])
print(neighbors)
Run Code Online (Sandbox Code Playgroud)