Выполните другую операцию соседства для указанных пикселей - PullRequest
3 голосов
/ 02 августа 2020

У меня есть HxW "карта характеристик", F. Предположим, что это карта HxWx1. С помощью другой операции у меня есть набор пикселей, которые меня интересуют (скажем, N пикселей). Каждый из этих пикселей связан с другим значением, поэтому мой набор имеет форму Nx3, где каждый пиксель имеет форму x, y и val. Обратите внимание, что это val отличается от значения карты функций в местоположении.

Вот мой вопрос. Можно ли векторизовать операцию соседства для каждой из этих точек? Для каждого пикселя n из N я использую sh, чтобы умножить соответствующий val на его окрестность 3x3 на карте функций F. Для окрестности 3x3 это дает новый набор элементов 3x3 new val. Я хочу заменить x y пикселем с максимумом new val (карта умноженных характеристик) в окне 3x3.

Это похоже на свертку (здесь небольшое злоупотребление терминологией) за которым следует операция максимального пула, но не совсем так, поскольку каждое местоположение пикселя имеет разное значение для умножения.

Пример ввода и вывода и пошаговое руководство для требуемого решения

Допустим, H = 10 и W = 10

Вот пример F

0.635955  0.922379  0.993406  0.007837  0.818661  0.983730  0.199866  0.757519  0.073152  0.015831
0.397718  0.097353  0.231351  0.177886  0.343099  0.419940  0.017342  0.087294  0.402266  0.366337
0.978686  0.476594  0.067836  0.148977  0.058994  0.810586  0.542894  0.797419  0.386559  0.225982
0.479860  0.033354  0.353366  0.431562  0.336208  0.674272  0.398151  0.713732  0.598623  0.829230
0.940838  0.869564  0.287100  0.669844  0.631836  0.748982  0.762292  0.597999  0.540236  0.758802
0.925995  0.141296  0.466772  0.672663  0.929746  0.544029  0.991860  0.197474  0.762866  0.798973
0.543519  0.128332  0.624323  0.876569  0.050709  0.223705  0.708381  0.380842  0.818092  0.163447
0.283125  0.329618  0.283481  0.672950  0.136922  0.897785  0.385479  0.764824  0.132671  0.091148
0.661984  0.369459  0.501181  0.352681  0.554113  0.133283  0.593048  0.108534  0.397813  0.836065
0.654929  0.928576  0.539204  0.931213  0.344114  0.591214  0.126809  0.456681  0.036531  0.725228

Моя структура пикселей, скажем N = 3 Три значения в следующем порядке: row, col, val: (для простоты я предполагаю, что x - это строки, а y - cols, хотя это не обязательно так). Это полностью не зависит от карты функций на предыдущем шаге.

3,2,0.38
4,4,0.602
7,5,0.9647

Окрестности вокруг (3,2):

[[0.4765941 , 0.06783561, 0.14897662],
[0.03335438, 0.35336647, 0.4315618 ],
[0.86956374, 0.28709952, 0.66984412]]

Таким образом, val * соседство урожаев. (здесь val равно 0,38)

[[0.18110576, 0.02577753, 0.05661112],
[0.01267466, 0.13427926, 0.16399349],
[0.33043422, 0.10909782, 0.25454077]]

Местоположение максимального значения здесь (2,0) т.е. (1,-1) относительно центрального пикселя. Таким образом, мой обновленный (x,y) должен быть (3,2) + (1,-1) = (4,1). Аналогично для двух других обновленных пикселей: (5,4) и (7,5)

Как я могу распараллелить все это? (Надеюсь, будет загружен на графический процессор с помощью Pytorch, но не обязательно, я еще не дошел до этого этапа.)

Примечание: я задавал этот вопрос несколько дней go, но это было плохо оформлено без надлежащей информации. Надеюсь, это решит проблему.

Изменить: для этого конкретного c экземпляра F может быть создан как случайный массив:

F = np.random.rand(10,10)

1 Ответ

3 голосов
/ 02 августа 2020

Если я правильно понял, вам нужно следующее:

from skimage.util.shape import view_as_windows
idx = pixels[:,0:2].astype(int)
print((np.unravel_index((view_as_windows(F,(3,3))[tuple(idx.T-1)]*pixels[:,-1][:,None,None]).reshape(-1,9).argmax(1),(3,3))+idx.T).T-1)
#if you need to replace the values of F with new values
F[tuple(idx.T)] = (view_as_windows(F,(3,3))[tuple(idx.T-1)]*pixels[:,-1][:,None,None]).reshape(-1,9).max(1)

Я предположил, что ваша форма окна (3,3). Конечно, вы можете это изменить. И если вам нужно иметь дело с граничными окрестностями, заполните свой F достаточным количеством нулей (в зависимости от размера вашего окна), используя np.pad, прежде чем использовать view_as_windows.

output:

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