如何缩放二进制掩码图案

时间:2019-01-03 01:35:51

标签: python matrix scaling binary-data

免责声明

我正在做一个将历史与数学结合起来的艺术项目。

问题:

假设我有一个像

这样的二进制掩码模式

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 :(得分:1)

  

保留原始模式的整体逻辑。

这很困难,假设您想要一个任意模式。基本上,您需要具备能够识别这种模式的AI,这是一项非常艰巨的任务。例如,请考虑3x3模式(为了便于阅读,零会变为空白):

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

答案 1 :(得分:0)

看起来您只想要一个2D矩阵并设置了非常外的边缘。在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]])