我在一个计算机视觉项目中使用OpenCV,但是,我需要对图像进行逐像素操作,这意味着访问640x480图像中的每个像素并更改其HSV值。图像由3D阵列X、Y和HSV值组成,因此130、230处的像素可以具有HSV值[12、26、18]或在图像中表示:(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秒。在
有没有更简单、更快速的方法来实现这一点?在
您应该做的第一件也是最简单的事情是检查OpenCV是否可以将numpy数组作为参数。Numpy是建立在快速C算法之上的,它可以在所谓的“矢量化”操作中处理数据结构上的大循环。Python中的每个循环都会产生非常大的开销。在
另一种选择可能是将这段代码放在Cython中,这样可以更好地处理类似这样的紧循环。在
如果我用Python编写计算机视觉,我肯定会使用Numpy并尽快将数组转换成Numpy格式。我想你可能想阿萨雷()从PIL转换为数组。在
相关问题 更多 >
编程相关推荐