【问题标题】:Converting a black and white image to List of Lists ( 0, 1) using Python使用 Python 将黑白图像转换为列表列表 (0, 1)
【发布时间】:2020-02-17 21:33:45
【问题描述】:

我正在使用 Python 中的 Turtle 模块创建一个解决迷宫的程序,为了绘制它,我使用 Lists of Lists 以通过 List[y][x] 表示列及其空间。将像 1 这样的图像转换为具有二进制值的列表的最佳方法是什么。

【问题讨论】:

  • 欢迎来到 Stack Overflow。纯粹的代码编写请求在 Stack Overflow 上是题外话——我们希望这里的问题与特定编程问题相关——但我们很乐意帮助您自己编写!告诉我们what you've tried,以及您遇到的问题。这也将有助于我们更好地回答您的问题。

标签: python image image-processing binary maze


【解决方案1】:

您可以使用Pillow 循环遍历图像的像素以检查它们是黑色还是白色。您不需要检查所有这些,为了优化过程,您可以检查每个块的一个像素并跳过其余的,这样,而不是检查 159.201 像素(399 x 399,图像的大小),您只检查 441 像素(21 x 21,块数)

这是一个如何阅读迷宫的示例:

from PIL import Image

BLOCK_SIZE = 19

im = Image.open('maze.jpg')
pixels = im.load()
width, height = im.size
offset = int(BLOCK_SIZE / 2)

maze = [
  [
    int(pixels[x + offset, y + offset][0] < 125)
    for y in range(0, height, BLOCK_SIZE)
  ]
  for x in range(0, width, BLOCK_SIZE)
]

如果您在处理后打印maze的内容:

for y in range(height / BLOCK_SIZE):
  for x in range(width / BLOCK_SIZE):
    print(maze[x][y]),
  print('')

这是你得到的:

1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1
1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1
1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1
1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1
1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1
1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1
1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1
1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1
1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1
1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1
1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1
1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1
1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1
1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1
1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1
1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1
1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

关于代码的几点说明:

int(pixels[x + offset, y + offset][0] < 125)

这会从块 (x, y) 中提取一个像素 (pixels[x + offset, y + offset]) 并从中提取 RGB 颜色的第一个通道,因为它可以是黑色或白色,所有 3 个通道应该具有相同的值(例如:(0, 0, 0) 表示黑色或 (255, 255, 255) 表示白色),但图像并不完美,有些颜色实际上是灰色的,这就是为什么我使用 &lt; 125 将黑色块与白色分开而不是检查特定值块。

offset 的目的是获取每个块中心的像素,这很有用,因为图像并不完美,块边界上的像素不太可靠

【讨论】:

  • 非常感谢您的回答!正是我要找的东西,我的问题是,你是如何获得盒子大小的?
  • block width = image width / maze columns = 399 / 21 = 19, block height = image height / maze rows = 399 / 21 = 19 块大小:19x19
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 2021-05-23
  • 2021-02-27
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2011-11-29
相关资源
最近更新 更多