2014-08-24 2 views
0

Я написал этот маленький код, чтобы сравнить значения оттенков серого двух изображений 100x100 jpeg. Однако производительность очень разочаровывает (1,5 секунды для 10.000 сравнений). Есть ли способ достичь лучшей производительности?Python Opencv img.item() производительность слишком медленная

Вот код:

import cv2 
import numpy as np 
import math 
import datetime 


img1 = cv2.imread('Testbild 2014-08-23 17:27:25.141362.jpeg', cv2.IMREAD_GRAYSCALE) 
img2 = cv2.imread('Testbild 2014-08-23 17:27:25.061802.jpeg', cv2.IMREAD_GRAYSCALE) 

height, width =img1.shape 
cnt = 0 
threshold = 10 

print("start:" + str(datetime.datetime.now())) 
for y in range(0 , height): 
    for x in range(0 , width): 
     val1 = img1.item(y,x) 
     val2 = img2.item(y,x) 
     diff_abs = math.fabs(int(val1)-int(val2)) 
     if diff_abs > threshold: 
      cnt += 1  
     if x == height and y == width: 
      break 
     if x == height: 
      x=0 
     if y == width: 
      y=0  

print("end:" + str(datetime.datetime.now())) 
print("Result: " + str(cnt)) 

Большое спасибо за ваши ответы!

ответ

5

Двойная петля:

for y in range(0 , height): 
    for x in range(0 , width): 
     val1 = img1.item(y,x) 
     val2 = img2.item(y,x) 
     diff_abs = math.fabs(int(val1)-int(val2)) 
     if diff_abs > threshold: 
      cnt += 1  
     if x == height and y == width: 
      break 
     if x == height: 
      x=0 
     if y == width: 
      y=0  

можно заменить:

diff_abs = np.abs(img1-img2) 
cnt = (diff_abs > threshold).sum() 

Это использует способность Numpy массива сделать fast element-wise arithmetic.


Состояние

x == height and y == width 

никогда не верно. Если height < width, то y никогда не будет равняться widthy находится в range(0, height)). Если height > width, то x никогда не будет равняться height. и если height == width, то ни x, ни y никогда не будет height.


Состояние

if x == height: 
     x=0 

не делает ничего полезного, так как даже если x == height присваивание x теряется на следующей итерации цикла.

То же самое относится и к

if y == width: 
     y=0  
+0

Вы человек! Время выполнения до 0,01 секунды - превысило мои ожидания. Большое спасибо. Извините за путаницу с x и y и спасибо за дополнительное объяснение. – flo

Смежные вопросы