Как избежать цикла for в массиве numpy - PullRequest
1 голос
/ 18 октября 2019

Я работаю над полутоновыми изображениями некоторых микроструктур сплавов, полученных с помощью оптического микроскопа и т. Д. Моя цель - проанализировать количество (%) областей с заданным порогом (количество пикселей), а также количество, размер и т. Д. из этих сегментов. Для последнего я использую: из показателя импорта Skimage морфологию, которая находит эти сегменты, и каждый сегмент имеет уникальное целое число в матрице меток, которая имеет ту же форму, что и рис. Я могу сделать все, кроме раскраски этих сегментов на исходном изображении без петли 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()

Есть ли эффективный «тупой способ», который не будет включать цикл «for» и будетследовательно, будет намного быстрее.

1 Ответ

3 голосов
/ 18 октября 2019

Если вывод уже верен, то вы можете повернуть пиксели, помеченные 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 from matplotlib

Но похоже, что вы пытаетесь сделать что-то еще - так что label = 1 выглядит иначе, чем label = 2. Как видите, я не использовал grains вообще. Если вы можете объяснить, как вы хотите, чтобы окончательное изображение выглядело, почти наверняка есть способ сделать это без петель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...