Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问照片像素数据的最快方法是什么?_Python_Performance_Numpy_Image Processing_Python Imaging Library - Fatal编程技术网

Python 访问照片像素数据的最快方法是什么?

Python 访问照片像素数据的最快方法是什么?,python,performance,numpy,image-processing,python-imaging-library,Python,Performance,Numpy,Image Processing,Python Imaging Library,我正在开发一个计算机视觉程序,并试图通过在视频持续时间内获取每个像素的中值来创建背景图像。为此,我将每个视频帧从RGB转换为灰度,并将数据转换为int32。一旦我这样做了,我想读取每个像素的灰度值,并将1添加到直方图的一个区域(每个像素都有自己的直方图分配给它) 这应该是一个简单的任务,但是它正在慢慢地变长。当我查看每个步骤的时间时,我看到转换的数量级为.01秒,但所有像素上的数据读取的数量级为1秒 由于灰度转换本质上是做更多的触发器,而不仅仅是读取每个像素上的数据并花费更少的时间,我知道一定有

我正在开发一个计算机视觉程序,并试图通过在视频持续时间内获取每个像素的中值来创建背景图像。为此,我将每个视频帧从RGB转换为灰度,并将数据转换为int32。一旦我这样做了,我想读取每个像素的灰度值,并将1添加到直方图的一个区域(每个像素都有自己的直方图分配给它)

这应该是一个简单的任务,但是它正在慢慢地变长。当我查看每个步骤的时间时,我看到转换的数量级为.01秒,但所有像素上的数据读取的数量级为1秒

由于灰度转换本质上是做更多的触发器,而不仅仅是读取每个像素上的数据并花费更少的时间,我知道一定有更好的方法来做到这一点。我已经尝试了多线程的进程,并没有看到2线程和4线程之间的速度加快,所以我不认为这会有帮助

backgroundImg=[[[0 for col in range(64)]
                    for col in range(1920)]
                        for row in range(1080)]
while(True)
    ret,frame=cam.read()
    if ret:
        frame=Image.fromarray(frame).convert('LA')
        frame=np.int32(frame)
        for line in range(0,1080):
            for col in range(0,1920):
                backgroundImage[line][col][frame[line][col][0]]+=1

这是我的代码示例。计算完背景图像后,我需要从每一帧中减去它,然后运行算法来查找所有连接的像素。

是的,Python中的循环速度很慢。您需要使用NumPy查找矢量化操作。如何对代码进行矢量化取决于循环内部发生的情况,因此我们无法提供帮助,除非您发布一个更有意义的示例。PIL还支持通过将函数应用于图像的每个像素以及其他许多常见图像处理任务来处理图像的每个像素,这可能会更快地完成您想要的任务。然而,正如@CrisLuengo所说,如果没有一个更有意义的例子来说明你想做什么,就很难更具体。你应该使用numpy数组来创建你的
背景img
我需要18秒。使用numpy需要0.6s
backgroundImg=numpy。零([108011920,64])
backgroundImg[line][col][int(frame[line][col 4)]+=1是我唯一需要做的操作。我不认为有一种方法可以向量化或映射函数,因为它需要引用图像中的位置。