使用1D数组求和3D数组元素

时间:2011-04-18 12:47:01

标签: python opencv

我正在将OpenCV用于计算机视觉项目,但是,我需要对图像进行逐像素操作,这意味着访问640x480图像中的每个像素并更改其HSV值。图像由3D阵列X,Y和HSV值组成,因此130,230处的像素可具有[12,26,18]的HSV值或在图像中表示:(130,230,(12, 26,18))

我需要执行一个操作,允许我在HSV值的V值(元素索引2)中添加一个X:(130,230,(12,26, 18 ) )

我可以使用两个循环来做到这一点:

for x in range(image.width):
        for y in range(image.height/2):
            initcolor = cv.Get2D(image, y, x)
            initcolor2 = [0, 0, 10, 0]
            summed = [sum(pair) for pair in zip(initcolor, initcolor2)] 
            cv.Set2D(image, y, x, summed)

但这非常缓慢,并且由于某种原因需要大约20秒才能完成整个图像的操作。

是否有更简单,更快捷的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

您应该做的第一件也是最简单的事情是检查OpenCV是否可以将numpy数组作为参数。 Numpy构建于快速C算法之上,可以在所谓的“矢量化”操作中处理数据结构上的大型循环。 Python中的每个循环都会产生非常大的开销。

另一种选择可能是将这段代码放在Cython中,这样可以更好地处理这种紧密循环。

答案 1 :(得分:0)

如果我在Python中使用计算机视觉,我肯定会使用Numpy并尽快让我的阵列变成numpy格式。我怀疑你可能想要numpy.asarray()从PIL转换为数组。