python - Pygame快速像素读取

标签 python algorithm image image-processing pygame

好吧,希望有人能帮我解决这个问题,因为我在这里不知所措。

我正在使用 python 开发一款游戏,该游戏使用相机作为主 Controller 。要玩这个游戏,您只需四处移动一个简单的灯,它就可以控制游戏。

到目前为止,我已经设法将相机图像放到表面上,并将其显示在屏幕上。但是,在寻找光线时,程序会慢得像爬行一样。

我第一次尝试使用 surface.get_at(x,y) 函数(这不是实际代码,这是一个示例):

maxL = 0
point = (0,0)
mysurface = get_cameraImg()
for i in range(mysurface.get_width()):
    for j in range(mysurface.get_height()):
        color = mysurface.get_at(i,j)
        lum = get_lum(color.r,color.g,color.b)
        if(lum>maxL):
            maxL = lum
            point = (i,j)

这太慢了,所以我开始研究。快速检查 pygame docs显示使用此方法一次获取像素 1 会很慢。于是我开始尝试使用 surfarray:

maxL = 0
point = (0,0)
mysurface = get_cameraImg()
ar = pygame.surfarray.array3d(mysurface)
for i in range(len(ar)):
    for j in range(len(ar[i]):
        color = ar[i][j]
        lum = get_lum(color[0],color[1],color[2])
        if(lum>maxL):
            maxL = lum
            point = (i,j)

但是,这也太慢了。对 surfarray 文档的快速双重检查表明 pygame.surfarray.pixels3d(surface) 会更快(因为没有复制实际值),但不幸的是我的相机图像不是 24 位或 32 位格式。 所以,这是我的问题:

在pygame中,有没有快速读取所有像素的方法?

我必须能够读取每个像素,对其进行 lum 计算,(maxcolor+mincolor)/2,然后查看它的 lum 是否为最大 lum。感谢您的宝贵时间。

最佳答案

surfarray 对象似乎是由 numpy 数组支持的,因此您能否更快地获得它取决于它们的 native 方法。

看看这个:numpy.argmax

您可能需要先将 3d 数组转换为 2d 光度矩阵(但不要使用嵌套循环!XD)。也许您需要进行一些整形以获得平面,然后通过简单的矩阵运算对它们进行平均...或者您可以切换到其他更易于使用的图像格式,例如 HSV 或灰度,而不是使用 RGB。

关于python - Pygame快速像素读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743545/

相关文章:

java - 将图像尺寸 (60x60) 转换为其他屏幕

ios - 如何从 UIImage 获取 URL?

python - 根据 Pandas 上的列值应用 lambda

python - 可选的正则表达式操作

python - 全局功能 block ?

java - 通过每次迭代更改每个字母将一个词转换为另一个词的算法应该形成另一个有意义的词?

javascript - 使用 Node.js 时 ImageMagick 裁剪尺寸不正确

Python:线性回归斜率和 y 轴截距

algorithm - 图灵机和算法有什么区别?

java - 放置n个点同时最大化最小距离