有人可以帮我优化这个算法吗?目前使用iteritems循环遍历每个像素需要太长时间,是否有更快的opencv替代算法?
我基本上有两个图像,并且正在覆盖一个水平和垂直移位,这就是lbx,ubx等正在计算的内容。然后我遍历重叠区域并为其计算成本函数。每个翻译大约需要18秒,并且循环通过简单的20x20像素网格转换需要400 * 18/60 = 2小时
编辑后:我认为正确使用numpy是关键。我不是通过计算位置来访问像素,而是将我正在比较的2个图像切片,然后使用izip同时逐步执行它们并进行比较。它仍然很慢,我想我在这里误解了一些东西。
编辑2:参见代码
我认为关键是使用通用功能。我正在比较两个大小相同的图像,并根据像素的相关性做一些事情,因此它不是像加法或乘法这样的标准通用函数。是否可以创建自定义的?
im1 = cv2.imread(url1, 5) #any number over 5 is color
im2 = cv2.imread(url2, 5)
total = ubx * uby
proportion_dict = {}
for x1,x2 in itertools.izip(xrange(lbx+x,ubx+x),xrange(lbx,ubx)):
for y1,y2 in itertools.izip(xrange(lby+y,uby+y),xrange(lby,uby)):
if (im1[x1][y1] == im2[x2][y2]).all():
pass
else:
key = str(clean_key(im1[x1][y1]))+str(clean_key(im2[x2][y2]))
if key in proportion_dict:
proportion_dict[key] += 1
else:
proportion_dict[key] = 1
### AFTER EDIT ####
im1_slice = im1[lby+y:uby+y,lbx+x:ubx+x]
im2_slice = im2[lby:uby,lbx:ubx]
for e1_row,e2_row in itertools.izip(im1_slice,im2_slice):
for e1_element, e2_element in itertools.izip(e1_row,e2_row):
dostuff()
## SECOND EDIT ###
#I've simplified the code to:
for e1_row,e2_row in itertools.izip(im1_slice.reshape(-1,3),im2_slice.reshape(-1,3)):
doStuff()
#but it's still very slow