我有一个Pygame黑色显示屏,我将在其上画一个白色的字母,如下图所示。显示屏的尺寸可以是100x100像素以上的任何尺寸。
我知道我可以使用这样的东西来获得表面2d数组:
miSuface = pygame.display.get_surface()
miCoso = pygame.surfarray.array2d(miSuface)
但是,我想以某种方式将此数组转换为7x5位矩阵,其中0将对应于黑色像素,1对应于白色像素。我的最终目的是使用矩阵训练神经网络并创建一个简单的OCR。有什么办法可以实现吗?或者有更好的方法来获得7x5矩阵吗?
答案 0 :(得分:2)
我不知道将array2d压缩成较小的数组或具有1位颜色信息的数组。但是,您可以执行以下操作:
答案 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步骤:
找出迷你矩阵的大小(除以5和7)。这适用于大于7x5的任何大小的图像。
对于每个迷你矩阵,计算黑色和白色空格(0和1)。
确定最终7x5矩阵中的空格是黑色还是白色。在我的例子中,我说如果(白色方块的数量> =黑色方块的数量),最终空间应该是黑色的。我担心使用它会给你带来麻烦,因为你的笔尺寸与7x5分区的尺寸相比相对较薄。如果这是一个问题,请尝试if(白色方块数* 2> =黑色方块数)。这有效地加重了白色方块的重量。
我很高兴详细说明这个伪代码。请告诉我。
最后,如果您仍有问题,我可能会尝试使用大于7x5的尺寸。它将以您的OCR算法为代价提供更高的精度。祝你好运。