与opencv和python的快速像素比较

时间:2013-12-03 18:46:39

标签: python opencv

有人可以帮我优化这个算法吗?目前使用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

0 个答案:

没有答案