2016-09-09 9 views
0

タイトルには画像があり、ピクセル座標を数学関数を使って変更したいと考えています。これまでのところ、以下のコードは動作しますが、ネストされたループのために非常に時間がかかります。早くするための提案はありますか?定量的であるためには、12MPixel画像でプロセスを完了するのに約2〜2.5分かかります。OPEN CV - ピクセル座標を変更します

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

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] 

OK以上が遅すぎだったので、私はベクトルのビットを追加し、それが高速です場合、私は興味:

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] 
+0

私が試した、あなたは正しかったです。同じ画像では170秒から99秒に落ちました。しかし、それでも私は60秒以下になる必要があります。 – Nikos

+0

お返事ありがとうございます! – mitoRibo

+0

更新されたコードを実行してみてください。 – mitoRibo

関連する問題