【问题标题】:convert image to value matrix将图像转换为值矩阵
【发布时间】:2012-06-28 00:09:06
【问题描述】:

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

例如图片:

应该转换成矩阵:

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

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

【问题讨论】:

  • 假设空间必须一致,一个不错的方法是计算左上角“矩形”中的所有像素,直到在 x 轴和 y 轴上达到不同的颜色。然后,您可以简单地将这个矩形的宽度/高度添加到其左上角像素,以获得其他矩形左上角像素的颜色。
  • 什么是已知的,什么是未知的?你知道有多少个彩色方块吗?如果您知道顺序和尺寸,则无需进行转换。只需创建新数组。
  • 我的回答解决了你的问题吗?

标签: python image-processing python-imaging-library


【解决方案1】:

我不确定 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 for cols 和 blockLengthY for rows 访问数组:

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]

【讨论】:

  • 图片为问题代码给出错误>>>result =a[::blockLengthX, ::blockLengthY] ValueError: slice step cannot be zero
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多