将PyGame黑白显示转换为7x5位矩阵

时间:2014-10-29 00:59:54

标签: python image-processing matrix pygame ocr

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

pygame window

我知道我可以使用这样的东西来获得表面2d数组:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我没有明确熟悉对pygame.surfarray.array2d()的调用。但是,由于您要从二进制颜色布局转换为较小的二进制颜色矩阵,因此可以使用新的比例细分原始图像,以便对生成的正方形进行正确着色。我举个例子。

假设您的初始图像是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]]

Psuedocode步骤:

  1. 找出迷你矩阵的大小(除以5和7)。这适用于大于7x5的任何大小的图像。

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

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

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

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