将图像转换为值矩阵

d.p*_*tto 3 python image-processing python-imaging-library

我的图像就像一个有4种颜色的棋盘(黑色,白色,红色,蓝色).我必须将此图像转换为数字矩阵:1表示白色,2表示黑色,3表示红色等.

例如图像:

棋盘

应转换为矩阵:

[[1,2,1,2,1,2...]
[2,1,2,1,2,1...]
...]
Run Code Online (Sandbox Code Playgroud)

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

小智 5

我不确定SVG图像,但我们假设你有一个PIL可读的图像格式(例如GIF,TIFF,JPEG,BMP,......).然后您可以使用PIL读取它:

import Image
img = Image.open("Chess_Board.bmp")
Run Code Online (Sandbox Code Playgroud)

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

quantized = img.convert('P', palette=Image.ADAPTIVE, colors=4)
Run Code Online (Sandbox Code Playgroud)

接下来我想我们将它转​​换为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])
Run Code Online (Sandbox Code Playgroud)

之后很容易.我们只使用stepize blockLengthX作为cols访问数组,使用blockLengthY访问行:

result = a[::blockLengthX, ::blockLengthY]
Run Code Online (Sandbox Code Playgroud)

当然,这假设您的所有块都具有完全相同的大小.这是完整的程序,可以更轻松地复制和粘贴.我也缩短了一点:

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]
Run Code Online (Sandbox Code Playgroud)