我正在用OpenCV在python中编写一个计算机视觉应用程序,我需要(经常)在同一图像的不同矩形区域上计算总和。一种计算方法是通过np.sum天真的方法,另一种方法是使用Integral Image,这样我只需要查找四个值即可计算总和。
我要测试的(单元测试)代码如下:
self.input_image = np.random.rand(self.rows, self.cols)
tic = time.clock()
for i in range(cnt):
np.sum(self.input_image[0:self.rows, 0:self.cols])
toc = time.clock()
t_direct_ms = ((toc-tic)/cnt)*1000.0
print ("direct time: %.5f ms" % t_direct_ms)
# self.ii._sum_image = cv2.integral(input_image)
tic = time.clock()
for i in range(cnt):
self.ii.sum_region(0, self.rows, 0, self.cols)
toc = time.clock()
t_integral_ms = ((toc - tic) / cnt)*1000.0
print ("lookup time: %.5f ms" % t_integral_ms)
print ("Speed ratio direct/integral: %.2f" % (t_direct_ms / t_integral_ms))
和
def sum_region(self, row_start, row_end, col_start, col_end):
A = self._sum_image[row_end, col_end]
B = self._sum_image[row_start, col_end]
C = self._sum_image[row_end, col_start]
D = self._sum_image[row_start, col_start]
return A - B - C + D
与
self._sum_image = cv2.integral(image)
结果是相同的(使用随机输入的图像进行测试),但是,我对大小为(300,80)的浮动图像的加速仅为15:
direct time: 0.01017 ms
lookup time: 0.00069 ms
Speed ratio direct/integral: 14.84
我期望更快的速度,因为积分图像仅包含一些查找,并且numpy.sum必须求和超过24000个值。
numpy的内部结构快得多吗?还是我的测量方式有问题?