【问题标题】:Transform a PyGame black and white display to a 7x5 bit Matrix将 PyGame 黑白显示转换为 7x5 位矩阵
【发布时间】:2023-12-27 14:50:01
【问题描述】:

我有一个 Pygame 黑色显示器,我将在其上绘制一个白色字母,如下图所示。显示器的尺寸可以是 100x100 像素以上。

我知道我可以使用这样的东西来获取表面二维数组:

    miSuface = pygame.display.get_surface()
    miCoso = pygame.surfarray.array2d(miSuface)

但是,我想以某种方式将此数组转换为 7x5 位矩阵,其中 0 对应于黑色像素,1 对应于白色像素。我的最终意图是使用矩阵来训练神经网络并创建一个简单的 OCR。有什么办法可以做到这一点?还是有更好的方法来获取 7x5 矩阵?

【问题讨论】:

    标签: python image-processing matrix pygame ocr


    【解决方案1】:

    我不知道有什么方法可以将你的 array2d 压缩成一个较小的数组或一个具有 1 位颜色信息的数组。但是,您可以执行以下操作:

    1. 遍历数组。如果颜色小于或等于 888888,则将其更改为 000000。如果大于,则将其更改为 FFFFFF。
    2. 创建一个新的 [7][5] 数组。
    3. 再次迭代。将每个像素的值(黑色 = 0,白色 = 1)添加到数组的任何给定的第 35 位。样本大小将完全取决于原始 array2d 的大小。如果该块的平均值大于或等于 17.5,则在矩阵中添加一个白色元素。如果小于 17.5,请在矩阵中添加一个黑色元素。

    【讨论】:

      【解决方案2】:

      我对@9​​87654321@ 的调用并不十分熟悉。但是,由于您要从二进制颜色布局转换为较小的二进制颜色矩阵,您可以使用新比例细分原始图像,以便为生成的正方形正确着色。我举个例子吧。

      假设您的初始图像是 14x10,并且您希望有一个 7x5 矩阵。您的初始图像如下所示:

      [[0,0,0,0,0,0,0,0,0,0,0,0,0,0],
       [0,0,0,0,0,0,0,0,0,0,0,0,0,0],
       [0,0,0,0,0,0,0,0,0,0,0,0,0,0],
       [0,0,0,0,0,0,0,1,0,0,0,0,0,0],
       [0,0,0,0,0,0,1,1,1,0,0,0,0,0],
       [0,0,0,0,0,1,1,0,1,1,0,0,0,0],
       [0,0,0,0,1,1,1,1,1,1,1,0,0,0],
       [0,0,0,1,1,1,1,1,1,1,1,1,0,0],
       [0,0,1,1,0,0,0,0,0,0,0,1,1,0],
       [0,1,1,0,0,0,0,0,0,0,0,0,1,1]]
      

      您需要做的是 x 方向除以 7,y 方向除以 5。由于我选择了不错的数字,您将看到的大图像的切片将是 2x2。以左上角的 2x2 块为例:

      [[0,0],
       [0,0]]       ->      [0]
      

      此迷你矩阵映射到 7x5 图像的单个像素。显然,在这种情况下它将为 0。让我们看看右下角:

      [[1,0],
       [1,1]]       ->      [1]
      

      这将映射到 7x5 图像中的值 1。如您所见,此示例中的棘手情况是当您有相等的 1 和 0 时。幸运的是,这不会是一个大问题,因为您的初始图像始终至少为 100x100。

      将此方法应用于我的示例,缩小的 7x5 图像如下所示:

      [[0,0,0,0,0,0,0],
       [0,0,0,0,0,0,0],
       [0,0,0,1,1,0,0],
       [0,0,1,1,1,1,0],
       [0,1,0,0,0,0,1]]
      

      伪代码步骤:

      1. 求小矩阵的大小(除以 5 和 7)。这适用于 任何 尺寸大于 7x5 的图像。

      2. 对于每个小矩阵,计算黑色和白色空间(0 和 1)。

      3. 决定最终 7x5 矩阵中的空间是黑色还是白色。在我的例子中,我说如果(白色方块的数量> = 黑色方块的数量),最后的空间应该是黑色的。我担心使用它会给您带来问题,因为与 7x5 分区的大小相比,您的笔尺寸相对较薄。如果这是一个问题,请尝试类似 if (白色方块的数量 * 2 >= 黑色方块的数量)。这有效地增加了白色方块的权重。

      我很高兴详细说明这个伪代码。请告诉我。

      最后,如果您仍有问题,我可能会尝试使用大于 7x5 的尺寸。它会以您的 OCR 算法为代价为您提供更高的精度。祝你好运。

      【讨论】:

      • 非常感谢您的帮助 :) 我将开始实施它,如果有任何问题,我会通知您。再次感谢