我有一个Pygame黑色显示屏,在其上我将绘制一个白色字母,如下图所示。显示器的大小可以是100x100像素以上的任何大小。
我知道我可以使用类似的方法来获取表面二维数组:
miSuface = pygame.display.get_surface()
miCoso = pygame.surfarray.array2d(miSuface)
但是,我想以某种方式将此数组转换为7x5位矩阵,在该矩阵上0将对应于黑色像素,而1将对应于白色像素。我的最终目的是使用矩阵来训练神经网络并创建简单的OCR。有什么办法可以实现?还是有更好的方法来获得7x5矩阵?
我对的调用并不十分熟悉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]]
伪代码步骤:
找出最小矩阵的大小(分别除以5和7)。这将适用于任何尺寸大于7x5的图像。
对于每个迷你矩阵,计算黑色和白色空格(0和1)。
确定最终7x5矩阵中的空格应为黑色还是白色。在我的示例中,我说如果(空格(白方块的数量> =黑方块的数量))的最终空间应为黑色。我担心使用此功能会给您带来麻烦,因为与7x5分区的笔相比,您的笔尺寸相对较薄。如果这是一个问题,请尝试类似if(白方块的数量* 2> =黑方块的数量)。有效地增加了白色正方形的权重。
我很高兴对此伪代码进行详细说明。请让我知道。
最后,如果您仍然遇到问题,我可以尝试使用大于7x5的尺寸。这将为您提供更高的精度,但会降低OCR算法的成本。祝你好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句