3

我有一个像棋盘的图像,有 4 种颜色(黑色、白色、红色、蓝色)。我必须将此图像转换为数字矩阵:1 代表白色,2 代表黑色,3 代表红色,依此类推。

例如图像:

棋盘

应转换为矩阵:

[[1,2,1,2,1,2...]
[2,1,2,1,2,1...]
...]

我更喜欢python中的解决方案。

4

1 回答 1

5

我不确定 SVG 图像,但假设您有 PIL 可读的图像格式(例如 GIF、TIFF、JPEG、BMP 等)。然后你可以像这样使用 PIL 来阅读它:

import Image
img = Image.open("Chess_Board.bmp")

现在我们要做quantization,所以图像像素不再是 RGB 而是从 0 到 3 的颜色索引(假设你想要 4 种不同的颜色):

quantized = img.convert('P', palette=Image.ADAPTIVE, colors=4)

接下来我想我们将其转换为 numpy 以便更轻松地访问各个像素。然后我们用 numpy 魔法来计算一个块中有多少个:

import numpy as np
a = np.array(quantized)
blockLengthX = np.argmin(a[0]==a[0,0])
blockLengthY = np.argmin(a[:,0]==a[0,0])

之后就很容易了。我们只是使用 stepsize blockLengthX 来访问数组,用于 cols 和 blockLengthY 用于行:

result = a[::blockLengthX, ::blockLengthY]

当然,这假设您的所有块的大小完全相同。这是更容易复制和粘贴的完整程序。我也缩短了一点:

import Image
import numpy as np
img = Image.open("Chess_Board.bmp")
a = np.array(img.convert('P', palette=Image.ADAPTIVE, colors=4))
blockLengthX = np.argmin(a[0]==a[0,0])
blockLengthY = np.argmin(a[:,0]==a[0,0])
result = a[::blockLengthX, ::blockLengthY]
于 2012-06-26T17:47:44.610 回答