трансляция создания маски - PullRequest
0 голосов
/ 04 января 2019

У меня n-размер изображения (n, row, col) и n-размер числа с плавающей запятой (n, 1).

я хочу создать маску размером 0 и 1 (строка, столбец). 1 в центре и 0 в краях. размер 1 соответствует весу.

Пример

>>> immask = np.zeros((2,8,8))
[[[0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]]]

>>> multiplier = np.array([16./64,32./64])
[0.25 0.5 ]

#**insert magic here**
# expected result : 
[[[0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 1. 1. 0. 0. 0.]
  [0. 0. 0. 1. 1. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]]]

есть ли способ сделать это с помощью трансляции? не используя цикл заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Попробуйте это:

In [1]: import numpy as np

In [3]: immask = np.zeros((2,8,8))

In [6]: immask[0, 3:5, 3:5] = 1                                                                          

In [7]: immask[1, 2:6, 2:6] = 1                                                                          

In [8]: immask                                                                                           
Out[8]: 
array([[[0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 1., 1., 0., 0., 0.],
        [0., 0., 0., 1., 1., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 1., 1., 1., 1., 0., 0.],
        [0., 0., 1., 1., 1., 1., 0., 0.],
        [0., 0., 1., 1., 1., 1., 0., 0.],
        [0., 0., 1., 1., 1., 1., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 0., 0.]]])
0 голосов
/ 04 января 2019

Эта функция делает что-то вроде этого:

import numpy as np

def make_masks(weights, rows, cols=None):
    if cols is None:
        cols = rows
    # Add two dimensions to weights
    w = np.asarray(weights)[:, np.newaxis, np.newaxis]
    # Open grid of row and column coordinates
    r, c = np.ogrid[-1:1:rows * 1j, -1:1:cols * 1j]
    # Make masks where criteria is met
    return (np.abs(r) <= w) & (np.abs(c) <= w)

# Test
masks = make_masks([0.25, 0.5], 8)
# Convert type as needed
masks_f = masks.astype(np.float32)
print(masks_f)

Выход:

[[[0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 1. 1. 0. 0. 0.]
  [0. 0. 0. 1. 1. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 1. 1. 1. 1. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0. 0. 0. 0.]]]

EDIT

Для создания круговых масок функция может быть следующей:

import numpy as np

def make_circle_masks(weights, rows, cols=None):
    if cols is None:
        cols = rows
    # Add two dimensions to weights
    w = np.asarray(weights)[:, np.newaxis, np.newaxis]
    # Open grid of row and column coordinates
    r, c = np.ogrid[-1:1:rows * 1j, -1:1:cols * 1j]
    # Arrays with distances to centre
    d = r * r + c * c
    # Make masks where criteria is met
    return d <= w * w
0 голосов
/ 04 января 2019

Я думаю, если вы хотите использовать какую-то матрицу, которая будет применена к изображению, это:

from scipy.ndimage.filters import convolve

может работать на вас. здесь можно посмотреть глубже

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