将图像转换为值矩阵

4
我有一张像国际象棋棋盘的图片,使用了4种颜色(黑色、白色、红色、蓝色)。我需要将这个图片转换成数字矩阵:1表示白色,2表示黑色,3表示红色等等。
例如,这张图片: Chessboard 应该被转换为以下矩阵:
[[1,2,1,2,1,2...]
[2,1,2,1,2,1...]
...]

我更倾向于使用Python实现解决方案。


假设空间必须是相等的,一个不错的方法是计算左上角“矩形”中所有像素,直到在x和y轴上都遇到不同的颜色。然后,您可以将此矩形的宽度/高度添加到其左上角像素,以获取其他矩形左上角像素的颜色。 - cabbagebot
已知和未知的是什么?你知道有多少个彩色方块吗?如果你知道顺序和大小,就不需要进行转换,只需创建新数组即可。 - fraxel
我的回答解决了你的问题吗? - Qlaus
1个回答

5

我不确定SVG图像,但假设您有一种可由PIL读取的图像格式(例如GIF,TIFF,JPEG,BMP等)。然后可以使用以下方式使用PIL读取它:

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

现在我们想要进行量化,这样图像像素就不再是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])

之后就很容易了。我们只需使用步长blockLengthX来访问列,使用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]

1
对于这张图片,代码出错了 >>>result =a[::blockLengthX, ::blockLengthY] ValueError: 切片步长不能为零 - d.putto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接