Я пишу приложение для компьютерного зрения на Python с OpenCV, в котором мне нужно (очень часто) вычислять сумму по разным прямоугольным областям одного и того же изображения. Одним из способов его вычисления является наивный способ через np.sum, а альтернативой является использование Integral Image , так что мне нужно только найти четыре значения для вычисления суммы.
Мой (unittest) -код для проверки выглядит так:
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 намного быстрее? Или есть проблема с тем, как я измеряю?