Проверка и модификация элементов в массиве numpy сегментации изображений при сохранении формы

#python #numpy #image-segmentation

#питон #тупица #сегментация изображений

Вопрос:

Я разрабатываю систему реального времени для фильтрации определенных областей изображения на основе их идентификатора класса из сети семантической сегментации. Из сети у меня есть массив numpy (13,16,1) идентификаторов классов (номера от 0 до 20), Которые соответствуют областям изображения (т. Е. (1,1) является самой верхней левой областью и т. Д.). То, что я хотел бы получить, — это то, на что я могу ссылаться позже в программе, чтобы решить, следует ли отфильтровывать данную область изображения на основе идентификатора класса.

Я хочу отфильтровать «черный список» классов (например, идентификаторы классов 0, 2, 13), а в дальнейшем анализировать только те области изображения, где эти классы не обнаружены.

Решение, которое я изначально предполагал, состояло в создании копии массива идентификаторов классов, выполнив проверку каждого элемента массива идентификаторов классов, проверив, совпадает ли идентификатор класса с каким-либо в «черном списке», и изменив это значение на 0 или 1 на основе этой проверки. Мне не удалось заставить работать ни одно из моих готовых решений, и я немного обеспокоен тем, что поэлементная проверка будет слишком медленной для производительности в реальном времени, особенно если я увеличу разрешение изображения.

Для справки, я начинаю с массива, подобного:

 class_ID_array = 1 2 3  4 5 6  7 8 9  

И я хочу выполнить операцию в этом направлении, которая выводит результат в формате desired_array:

 desired_array = class_ID_array.copy() blacklist = [2, 4, 5] for x in desired_array:  if x is in blacklist:  x = 0  else:  x = 1  desired_array = 1 0 1  0 0 1  1 1 1  

Каков был бы эффективный способ сделать это?

Ответ №1:

 def operation( a, blacklist ):  s = a.shape  l = np.ndarray.flatten( a )  ol = [ e not in blacklist for e in l ]  return np.reshape( ol, s )