[英]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 你有:
但是您似乎正在尝试做其他事情-因此label = 1
看起来与label = 2
不同。 如您所见,我根本没有使用grains
。 如果您可以解释您希望最终图像的外观,几乎可以肯定有一种方法可以在没有循环的情况下做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.