gpt4 book ai didi

python - 找到分割区域的最大值

转载 作者:行者123 更新时间:2023-11-28 19:01:21 25 4
gpt4 key购买 nike

我有 2 张相同尺寸的 3D 灰度图像。

第一个图像 (img) 是 3D 体积的原始数据(使用显微镜获得)并包含各种细胞。 Example slice of raw 3d image

第二张图片 (imglab) 是原始图片的蒙版版本,其中每个已识别的单元格都填充了一个唯一的值(即单元格 1 = 全 1,单元格 2 = 全 2) .所有非单元格区域都是零。 Example slice of masked 3d image

我现在试图从原始数据中找到每个单元格的最大值的坐标,该坐标对应于标记的掩码数组。

目前,我有一个非常低效的循环。我怀疑有一种方法可以使用单个 np.where 调用来设置多个条件,但我不知道该怎么做。当前的for循环方法如下:

coordinates = []
for i in range(1, int(imglab.max())): # Number of cells = max value of label image
max_val = np.max(img[imglab == i])
max_coord = np.where((img == max_val) & (imglab == i))
coordinates.append(max_coord)

最佳答案

当很难找到一种高效且与 numpy 兼容的编码方式,但是当带有 for 循环的代码很简单时,您可以使用 njit from numba.

它最适合处理平面数组,所以首先让我们在 numba 中编写一个函数来执行您所要求的,但在 1d 中:

from numba import njit, int64

@njit
def fast_max_flat(img_flat, imglab_flat):
n_cells =int(imglab_flat.max()) # number of cells
max_values = np.full(n_cells, - np.inf) # stores the n_cells max values seen so far
max_coords = np.zeros(n_cells, dtype=int64) # stores the corresponding coordinate
n_pixels = len(img)
for i in range(n_pixels):
label = imglab_flat[i]
value = img_flat[i]
if max_values[label] < value:
max_values[label] = value
max_coords[label] = i
return max_coords

然后编写一个 python 包装器来分解数组,应用前面的函数,并将坐标作为列表检索:

def wrapper(img, imglab):
dim = img.shape
coords = fast_max_flat(img.ravel(), imglab.ravel())
return [np.unravel_index(coord, dim) for coord in coords]

在我的机器上,使用包含 3 个细胞的 100 x 100 x 100 图像,这比您的方法快约 50 倍。

关于python - 找到分割区域的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52291284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com