如何缩放二进制掩模图案

How to scale a binary mask pattern

免责声明

我正在为一个结合历史和数学的艺术项目做这件事。

问题:

假设我有一个像

这样的二进制掩码模式

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 列的矩阵,代表一个万字符图案

我想知道是否有任何快速获取模式"enlarged-scaled"版本的方法

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 列,保留了原始模式的整体逻辑

对于这种情况,可能有什么方便的方法?

任何帮助将不胜感激

preserves the overall logic of the original pattern.

这是困难的一点,假设你想要一个任意模式。您基本上是在寻找能够 辨别 这种模式的 AI,这是一项非常重要的任务。例如,考虑 3x3 模式(为了便于阅读,零显示为空白):

111
1 1
111

这个模式是"outer units set"还是"inner unit clear"?这两者之间的区别是巨大的,因为前者是你想要的,但后者最终会以更粗的边界线结束。换句话说,它将是以下之一:

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

您似乎只想要一个设置了最外边的二维矩阵。在 numpy 中:

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