2016-12-06 84 views
-2

我有一张包含不同颜色的图像的图像。的板的部分看起来像这样:将游戏板的图像转换为2D阵列

enter image description here

我试图将此转换为与表示不同瓦片如本的每个元素的二维数组:

[[1, 1, 1, 2], 
[1, 3, 1, 1], 
[1, 2, 3, 3], 
[3, 1, 2, 2]] 

我目前使用Python图像库和numpy来获取具有简化调色板的图像的位图

from PIL import Image 
import numpy as np 
img = Image.open("board.png") 
board = np.array(img.convert('P', palette=Image.ADAPTIVE, colors=5)) 

而不是让数组中的每个元素表示一个像素,我需要它来表示一个图块。

+0

@leaf更改了它 –

+1

没有足够的信息。请阅读http://stackoverflow.com/help/how-to-ask和http://stackoverflow.com/help/mcve。 SO不是代码写入服务。 – wwii

+0

@wwii我应该编辑还是删除并重新提交? –

回答

0

我会推荐ImageMagick它有Python绑定,但我只是在命令行上演示。它安装在大多数Linux发行版上,可用于OS X和Windows。

所以,把你的启动图像,称为board.png,你可以一次运行该作可接受的颜色的LUT在输出图像:

convert xc:"rgb(250,85,100)" xc:"rgb(249,162,54)" xc:"rgb(32,164,139)" +append lut.png 

enter image description here

然后平铺图像分割成4行和4列,并获得每个中心像素,并将其重新映射到LUT:

convert board.png -crop [email protected] +repage -gravity center -crop 1x1+0+0 -remap lut.png til-%02d.png 

这会给你16个图像:

til-00.png til-02.png til-04.png til-06.png til-08.png til-10.png til-12.png til-14.png 
til-01.png til-03.png til-05.png til-07.png til-09.png til-11.png til-13.png til-15.png 

如果我蒙太奇他们都连成一片:

montage -tile 4x4 til-* montage.png 

enter image description here

或者,如果我蒙太奇他们,并打印出每次16个像素的颜色:

convert board.png -crop [email protected] +repage -gravity center -crop 1x1+0+0 -remap lut.png txt: 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (63993,41634,13878,65535) #F9A236FF srgba(249,162,54,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (8224,42148,35723,65535) #20A48BFF srgba(32,164,139,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (63993,41634,13878,65535) #F9A236FF srgba(249,162,54,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (8224,42148,35723,65535) #20A48BFF srgba(32,164,139,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (8224,42148,35723,65535) #20A48BFF srgba(32,164,139,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (8224,42148,35723,65535) #20A48BFF srgba(32,164,139,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (64250,21845,25700,65535) #FA5564FF srgba(250,85,100,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (63993,41634,13878,65535) #F9A236FF srgba(249,162,54,1) 
# ImageMagick pixel enumeration: 1,1,65535,srgba 
0,0: (63993,41634,13878,65535) #F9A236FF srgba(249,162,54,1) 
1

这是不理想的,因为你必须知道“边距”和“偏移”,但你可以简单地从ce获取颜色每瓦的NTER并转换为数字

from PIL import Image 

img = Image.open("board.png") 

margin_x = 35 
offset_x = 65 

margin_y = 35 
offset_y = 65 

# to remember color 
colors = [] 


for col in range(4): 
    for row in range(4): 

     # get pixel position 
     x = margin_x + col * offset_x 
     y = margin_y + row * offset_y 

     # get pixel 
     px = img.getpixel((x, y)) 

     # add to list 
     if px not in colors: 
      colors.append(px) 

     # convert color to number 
     number = colors.index(px) + 1 

     print(number, end=' ') 

    print() 

结果:

1 1 1 2 
1 2 3 1 
1 1 2 3 
3 1 2 3 
0

既然你已经转换的图像分别标注每个颜色,你可以得到每个区块的中心标签以下方式:

step = np.array(board.shape) // 4 
board_m = board[(step[0]//2):board.shape[0]:step[0], (step[1]//2):board.shape[1]:step[1]] 
print(board_m) 

鉴于输入图像总是包含4x4片,并且它是很好的中心,将产生所希望的输出:

[[2 2 2 3] 
[2 0 2 2] 
[2 3 0 0] 
[0 2 3 3]]