免责声明:
我正在做一个将历史与数学结合起来的艺术项目。
问题:
假设我有一个像
这样的二进制掩码模式 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_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列,并且保留了原始模式的整体逻辑。
此案可能有什么方便的方法?
任何帮助将不胜感激
答案 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]])