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

2024-05-14 09:14:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

pygame window

我知道我可以用这样的方法来获得曲面二维阵列:

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

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


Tags: 方法getdisplay字母矩阵像素显示器surface
2条回答

我不太熟悉对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块为例:

^{pr2}$

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

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

这将映射到7x5图像中的值1。幸运的是,在这个例子中,你可以看到,在初始值为1000的情况下,这个问题并不复杂。在

将此方法应用到我的示例中,缩小的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]]

psuecode步骤:

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

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

  3. 决定最后的7x5矩阵中的空格应该是黑色还是白色。在我的例子中,我说最后一个空格应该是黑色if(whitesquares>;=number of black squares)。我担心使用这个会给你带来麻烦,因为你的笔的尺寸相对7x5刻度的笔要薄一些。如果这是一个问题,请尝试类似If(白色方块的数量*2>;=黑色方块的数量)。这有效地增加了白色方块的权重。

我很高兴详细介绍一下这个伪代码。告诉我。在

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

我不知道有什么方法可以直接将array2d压缩成更小的数组,或者包含1位颜色信息的数组。但是,您可以执行以下操作:

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

相关问题 更多 >

    热门问题