如何缩放二进制掩模图案
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]])
免责声明:
我正在为一个结合历史和数学的艺术项目做这件事。
问题:
假设我有一个像
这样的二进制掩码模式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]])