繁体   English   中英

如何避免 numpy 数组中的“for”循环

[英]How to avoid 'for' loop in numpy array

我正在研究用光学显微镜等拍摄的一些合金微观结构的灰度图像。我的目标是分析具有给定阈值(像素数)的区域的数量(%),以及这些区域的数量、大小等段。 最后我使用:from skimage import measure,morphology,它找到这些段,每个段在标签矩阵中都有唯一的 integer,其形状与图片相同。 我可以做所有事情,除了在没有for循环的情况下为原始图像上的这些片段着色..

import numpy as np
import matplotlib.pyplot as plt

grains = np.array([[1,3], [2,5], [6,2]] )

labels=np.array([[1,1,0,0,0],[1,0,0,2,0],[0,0,2,2,2],[0,0,0,2,0],[6,6,0,0,0]])

im = np.array([[223, 222, 225, 224, 227],[222, 224, 218, 220, 221],[216, 221, 219, 223, 225],[228, 226, 231, 224, 228],[226, 228, 225, 218, 225]])

image=np.stack((im, im, im), axis=2)       # greyscale sample image

color = [0, 0, 255]                        # rgb blue color

for i in grains:
    B=np.full((i[1],3), color).astype('int')
    image[labels==i[0]]=B

plt.imshow(image)
plt.show()

是否有任何有效的“numpy 方式”,它不包括“for”循环,因此会更快。

如果 output 已经正确,那么您可以将labels中标记的像素变为蓝色,如下所示:

import numpy as np
import matplotlib.pyplot as plt

labels = np.array([[1,1,0,0,0],
                   [1,0,0,2,0],
                   [0,0,2,2,2],
                   [0,0,0,2,0],
                   [6,6,0,0,0]])

im = np.array([[223, 222, 225, 224, 227],
               [222, 224, 218, 220, 221],
               [216, 221, 219, 223, 225],
               [228, 226, 231, 224, 228],
               [226, 228, 225, 218, 225]])

image = np.stack((im, im, im), axis=2)
image[labels >= 1] = [0, 0, 255]

plt.imshow(image)

这给出了相同的 output 你有:

matplotlib 的输出

但是您似乎正在尝试做其他事情-因此label = 1看起来与label = 2不同。 如您所见,我根本没有使用grains 如果您可以解释您希望最终图像的外观,几乎可以肯定有一种方法可以在没有循环的情况下做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM