Как масштабировать шаблон бинарной маски - PullRequest
0 голосов
/ 03 января 2019

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ :

Я делаю это для художественного проекта, который объединяет историю с математикой.

ВОПРОС:

Допустим, у меня есть шаблон двоичной маски, такой как

mask = [1,0,1,1,1],[1,0,1,0,0],[1,1,1,1,1],[0,0,1,0,1],[1,1,1,0,1]

это матрица из 5 строк и 5 столбцов, представляющая шаблон свастики

enter image description here

Мне интересно , есть ли какие-нибудь быстрые способы получения "увеличенной в масштабе" версии шаблона

enlarged_mask = [1,0,0,1,1,1,1], [1,0,0,1,0,0,0], [1,0,0,1,0,0,0], [1,1,1,1,1,1,1], [0,0,0,1,0,0,1], [0,0,0,1,0,0,1], [1,1,1,1,0,0,1]

что в этом случае теперь имеет 7 строк и 7 столбцов, а сохраняет общую логику исходного шаблона .

enter image description here

Чтоможет быть удобным способом для дела?

Любая помощь будет высоко ценится

Ответы [ 2 ]

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

Похоже, вы просто хотите двумерную матрицу с установленными внешними краями.В numy:

import numpy as np

n = 5 # or 3 or whatever
mask = np.ones((n, n), dtype=int)
mask[1:-1,1:-1] = 0
print(mask)

Результат:

array([[1, 1, 1, 1, 1],
       [1, 0, 0, 0, 1],
       [1, 0, 0, 0, 1],
       [1, 0, 0, 0, 1],
       [1, 1, 1, 1, 1]])
0 голосов
/ 03 января 2019

сохраняет общую логику исходного шаблона.

Это сложный бит, при условии, что вы хотите произвольный шаблон . Вы в основном после ИИ, способного распознать этот паттерн, очень нетривиальная задача. Например, рассмотрим шаблон 3х3 (нули для удобства читаются пустыми):

111
1 1
111

Этот шаблон "внешние единицы установлен" или "внутренний блок очищен"? Разница между этими двумя огромна, так как первая - это то, что вам нужно, но последняя будет иметь гораздо более толстую границу. Другими словами, это будет одно из:

Outer-set       Inner-clear
=========       ===========
  11111            11111
  1   1            11111
  1   1            11 11
  1   1            11111
  11111            11111

Это еще до того, как вы рассмотрите другие возможности, такие как простое масштабирование самого изображения, так что вы работаете с разрешением в единицу.


Однако, поскольку кажется, что вы используете определенный шаблон (заранее известный), вы можете сгенерировать свастику шириной в один пиксель с помощью следующего кода:

def swastika(n):
    # Ignore requests for malformed images.

    if n < 1 or n % 2 == 0: return []
    matrix = [[0 for _ in range(n)] for _ in range(n)]

    # Do the cross bit.

    for i in range(n):
        matrix[n//2][i] = 1
        matrix[i][n//2] = 1

    # Do the outer arms.

    for i in range(n//2,n):
        matrix[0][i] = 1
        matrix[i][n-1] = 1
        matrix[n-1][n-i-1] = 1
        matrix[n-i-1][0] = 1

    return matrix

# Test harness for various sizes.

for i in range(5, 10, 2):
    s = swastika(i)
    for j in range(i):
        print(s[j])
    print()

Вывод этого (изменен для удобства чтения, еще раз):

                     1   11111
         1  1111     1   1
1 111    1  1        1   1
1 1      1  1        1   1
11111    1111111     111111111
  1 1       1  1         1   1
111 1       1  1         1   1
         1111  1         1   1
                     11111   1
...