几天前,我开始使用新的OpenCV-Python界面cv2。
cv2
我的问题是关于cv和cv2接口的比较。
cv
关于易用性,新cv2界面得到了更大的改进,并且使用起来确实非常容易和有趣cv2。
但是速度呢?
我制作了两个小代码段,一个在cv另一个中cv2,以检查性能。两者具有相同的功能,访问图像的像素,对其进行测试,进行一些修改等。
下面是代码:
cv2 interface :
cv2 interface
import time import numpy as np import cv2 gray = cv2.imread('sir.jpg',0) width = gray.shape[0] height = gray.shape[1] h = np.empty([width,height,3]) t = time.time() for i in xrange(width): for j in xrange(height): if gray[i,j]==127: h[i,j]=[255,255,255] elif gray[i,j]>127: h[i,j]=[0,0,255-gray[i,j]] else: h[i,j]=[gray[i,j],0,0] t2 = time.time()-t print "time taken = ",t2
================================================== ===
结果是:
花费时间= 14.4029130936
================================================== ====
简历界面:
import cv,time gray = cv.LoadImage('sir.jpg',0) h = cv.CreateImage(cv.GetSize(gray),8,3) t=time.time() for i in xrange(gray.width): for j in xrange(gray.height): k = cv.Get2D(gray,j,i)[0] if k==127: cv.Set2D(h,j,i,(255,255,255)) elif k>127: cv.Set2D(h,j,i,(0,0,255-k)) else: cv.Set2D(h,j,i,(k,0,0)) t2 = time.time()-t print "time taken = ",t2 cv.ShowImage('img',h) cv.WaitKey(0)
花费时间= 1.16368889809
================================================== =====
看,这里的老cv约为12 times faster比cv2。结果图像是相同的。(输入图像的尺寸为720x540)
12 times faster
为什么会这样?
与cv相比,cv2慢吗?
还是我在这里犯任何错误?以上代码在cv2中是否有更快的方法?
cv2.imread()返回的图像是NumPy的数组对象。因此,您可以使用NumPy的函数来加快计算速度。
以下程序显示了如何通过使用ndarray对象的item(),itemset()方法加快循环版本的来源。
import time import numpy as np import cv2 gray = cv2.imread('lena_full.jpg',0) height, width = gray.shape h = np.empty((height,width,3), np.uint8) t = time.time() for i in xrange(height): for j in xrange(width): k = gray.item(i, j) if k == 127: h.itemset(i, j, 0, 255) h.itemset(i, j, 1, 255) h.itemset(i, j, 2, 255) elif k > 127: h.itemset(i, j, 0, 0) h.itemset(i, j, 1, 0) h.itemset(i, j, 2, 255-k) else: h.itemset(i, j, 0, k) h.itemset(i, j, 1, 0) h.itemset(i, j, 2, 0) print time.time()-t
下面的程序演示了如何首先创建调色板,并使用NumPy的数组索引来获取结果:
t = time.time() palette = [] for i in xrange(256): if i == 127: palette.append((255, 255, 255)) elif i > 127: palette.append((0,0,255-i)) else: palette.append((i, 0, 0)) palette = np.array(palette, np.uint8) h2 = palette[gray] print time.time() - t print np.all(h==h2)
输出为:
0.453000068665 0.0309998989105 True
简历版本输出为:
0.468999862671
注意:轴0的长度是图像的高度,轴1的长度是图像的宽度