【发布时间】:2021-06-29 04:57:28
【问题描述】:
我计算了图像的分割,其中每个超像素(区域)都由与图像大小相同的 2D 数组中的条目值定义。我正在尝试获取每个区域的索引列表,以便稍后执行每个区域的操作。 这是我当前的代码:
index_list = []
for i in range(num_superpixels):
indices = np.where(superpixels == i)
index_list.append(indices)
以下是一个包含 3 个区域的 3x3 输入的最小示例。在实践中,我使用从 640x480 图像中获得的 500-1000 超像素,并且速度非常慢。
>>> superpixels
array([[0, 0, 2],
[0, 0, 2],
[1, 1, 2]])
>>> index_list
[[array([0, 0, 1, 1]), array([0, 1, 0, 1])],
[array([2, 2]), array([0, 1])],
[array([0, 1, 2]), array([2, 2, 2])]]
由于每个区域都是一个连续的块(在 2D 图像中,但不在内存中),在循环中使用 np.where 确实效率低下 - 在每次迭代中,它都会遍历 width*height 条目以找到约 500 个条目的区域.
如何加快速度?
【问题讨论】:
-
“区域由与图像大小相同的二维数组中的条目的值定义”。哪个二维数组?你的意思是
superpixels?您是否根据差异计算每个区域? -
@Kevin 实际上,超像素是包含每个超像素/区域索引的二维数组。区域的计算来自外部 API,它的完成方式可能会改变,但输出格式将是 2D 数组索引区域,如所述
-
所以你不知道区域是如何计算的?你只知道这个外部 API 的输入和输出?
-
没错。
-
大多数每个区域的操作在标记图像本身上执行的效果要好于在带有索引的数组上。这个数组只是图像的一个非常低效的表示。
标签: python arrays numpy image-processing