如标题所示我有一个图像,其像素坐标我想用数学函数改变。到目前为止,我有以下代码,但由于嵌套循环非常耗时。你有任何建议让它更快吗?要定量,在1200万像素图像上完成整个过程大约需要2-2.5分钟。
imgcor = np.zeros(img.shape, dtype=img.dtype)
for f in range(rowc):
for k in range(colc):
offX = k + (f*b*c*(math.sin(math.radians(a))))
offY = f + (f*b*d*(math.cos(math.radians(a))))
imgcor[f, k] = img[int(offY)%rowc, int(offX)%colc]
P.S。我使用的是opencv 2.4.13和python 2.7
答案 0 :(得分:0)
可能有办法让numpy为你做一些矢量化工作,但一个简单的加速是每次你循环时不重新计算一些值(我假设a,b,c,并且d在循环中没有变化)。我很好奇加速会是什么,你能报告回来吗?
imgcor = np.zeros(img.shape, dtype=img.dtype)
offX_precalc = b*c*(math.sin(math.radians(a)))
offY_precalc = b*d*(math.cos(math.radians(a)))
for f in range(rowc):
for k in range(colc):
offX = k + (f*offX_precalc)
offY = f + (f*offY_precalc)
imgcor[f, k] = img[int(offY)%rowc, int(offX)%colc]
好吧,因为上面的速度太慢了,我添加了一些矢量化,如果它更快,我很好奇:
imgcor = np.zeros(img.shape, dtype=img.dtype)
off_base = b*(math.sin(math.radians(a)))
offX_precalc = off_base*c
offY_precalc = off_base*d+1
for f in range(rowc):
offY = int(f*offY_precalc)%rowc
offXs = [int(k + (f*offX_precalc))%colc for k in range(colc)]
imgcor[f,:] = img[offY, offXs]