【发布时间】:2022-11-23 19:53:36
【问题描述】:
我有一张我用tifffile.imread读入的图像,它变成了一个3D矩阵,第一维代表Y坐标,第二维代表X,第三维代表图像的通道(这些图像不是RGB等可以有任意数量的通道)。
这些图像中的每一个都有一个标签掩码,它是一个二维数组,指示图像中对象的位置。在标签掩码中,值为 0 的像素不属于任何对象,值为 1 的像素属于第一个对象,值为 2 的像素属于第二个对象,依此类推。
我想计算的是每个对象和图像的每个通道,我想知道通道的平均值、中值、标准差、最小值和最大值。因此,例如,我想知道对象 10 中像素的第一个通道的平均值、中值标准差、最小值和最大值。
我已经编写了代码来执行此操作,但它非常慢(如下所示),我想知道人们是否有更好的方法或知道一个可能有助于我更快/更有效地执行此操作的程序包。 (此处“污点”一词与通道的含义相同)
sample = imread(input_img)
label_mask = np.load(input_mask)
n_stains = sample.shape[2]
n_labels = np.max(label_mask)
#Create empty dataframe to store intensity measurements
intensity_measurements = pd.DataFrame(columns = ['sample', 'label', 'stain', 'mean', 'median', 'std', 'min', 'max'])
for label in range(1, n_labels+1):
for stain in range(n_stains):
#Extract stain and label
stain_label = sample[:,:,stain][label_mask == label]
#Calculate intensity measurements
mean = np.mean(stain_label)
median = np.median(stain_label)
std = np.std(stain_label)
min = np.min(stain_label)
max = np.max(stain_label)
#Add intensity measurements to dataframe
intensity_measurements = intensity_measurements.append({'sample' : args.input_img, 'label': label, 'stain': stain, 'mean': mean, 'median': median, 'std': std, 'min': min, 'max': max}, ignore_index=True)
【问题讨论】:
-
请问图像的尺寸以及通道和对象的数量是多少?您的代码需要多长时间?
-
输入可以是任何大小,我们的图像目前范围在 128x128 到 150000x80000 之间,通道数在 2 到 5 之间。具有 3 个通道的大图像的当前运行时间和此代码 >48hrs
-
只是好奇你是否尝试过我提出的方法 :) 特别是在巨大的图像上。我猜它需要大量的内存。
-
由于 Python 仅使用单核/线程,您可以考虑使用多处理,因为现在几乎所有 CPU 都有 4 个或更多核。为每个流程分配标签或其他粒度。或者,考虑使用
numba对 5 行(np.mean()、np.median() ... np.max())进行编码 -
@Raibek 我已经运行了你的算法,但它似乎比原始帖子中的算法花费的时间明显更长。不幸的是,我们的集群现在正在进行维护,但一旦它恢复正常,我希望能带回一些基准测试