2016-09-09 2 views
0

Как указано в заголовке, у меня есть изображение, координаты пикселей которого я хочу изменить, используя математическую функцию. До сих пор у меня есть следующий код, который работает, но очень трудоемкий из-за вложенного цикла. Есть ли у вас какие-либо предложения сделать это быстрее? Чтобы быть количественным, для завершения процесса на 12-мегапиксельном изображении требуется около 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 для выполнения какой-либо векторной работы для вас, но одно простое ускорение - не переучитывать некоторые значения при каждом цикле (I Предполагая, что 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] 
+0

Я попробовал, и вы были правы. Для этого же изображения он упал с 170 секунд до 99 секунд. Но все же мне нужно опуститься ниже 60 секунд, хотя хорошая рекомендация. – Nikos

+0

ОК, спасибо, что ответили! – mitoRibo

+0

Вы также можете попробовать запустить обновленный код? – mitoRibo

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