#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 )