Python 如何缩放二进制掩码图案

Python 如何缩放二进制掩码图案,python,matrix,scaling,binary-data,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列的矩阵,表示一个纳粹党徽图案 我想知道是否有快速获得“放大”版图案的方法 放大的_掩码=[1,0,0,1,1,1,1,1],[1,0,0,1,0,0,0,0,0],[1,1,1,1,1,1,1,1,1,1,1],[0,0,0,1,0,1,0,1],[0,

免责声明

我这样做是为了一个结合了历史和数学的艺术项目

问题:

假设我有一个二元掩模图案,比如

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列的矩阵,表示一个纳粹党徽图案

我想知道是否有快速获得“放大”版图案的方法

放大的_掩码=[1,0,0,1,1,1,1,1],[1,0,0,1,0,0,0,0,0],[1,1,1,1,1,1,1,1,1,1,1],[0,0,0,1,0,1,0,1],[0,0,0,0,1],[1,1,1,0,0,1]

在本例中,它现在有7行7列,并保留了原始模式的整体逻辑

对于这个案例,什么可能是一种方便的方法

任何帮助都将不胜感激

保留原始模式的整体逻辑

假设你想要一个任意的模式,这是很难的。你基本上是在寻找一个能够识别这种模式的人工智能,这是一个非常不平凡的任务。例如,考虑3x3模式(零是空白的可读性):

这种模式是“外部单位设置”还是“内部单位清除”?这两者之间的区别是巨大的,因为前者是你想要的,但后者最终会有一个更厚的边界线。换句话说,它将是以下之一:

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

看起来您只需要一个具有非常外部边集的2D矩阵。在努比:

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和1。“看起来您只需要一个具有非常外部边缘集的2D矩阵”,不。问题中指定的模式只是一个示例。我对能够解决通用场景的算法感兴趣。在这种情况下,问题太广泛,无法回答。没有简单的算法来识别图案,特别是从一个微不足道的3x3数组中。@Loss:当然,如果事先知道规则,而不是试图从位图中识别规则。否则,请参见我的段落“除固定图案以外的任何东西,如前所述,都需要相当多的人工智能。”:-)我正在尝试为一个艺术项目缩放纳粹党徽图案。我可以用我发给你的
矩阵=[1,0,1,1,1,1],[1,0,1,0,0],[1,1,1,1,1],[0,0,1,0,1],[1,1,1,0,1]
编辑我的问题。您可以详细说明您的答案吗?@Loss,请参阅更新。我为具体要求添加了一个部分。非常感谢,它完美地完成了工作。您认为在函数实现中是否也可以保留线条的总厚度?也就是说,不让图案随着n的增加而越来越薄,而是保持一个整体可接受的厚度。@损失,可能是的。然而,我建议把这个问题作为另一个问题来问,如果需要的话,链接回这个问题。我已经根据你的问题编辑对答案进行了大量修改,所以我不想再这样做了。保留厚度基本上意味着计算出线宽与图像大小的比率(1:6),但确保宽度始终是最接近的整数。我认为这最好作为一个单独的问题来解决。
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]])