Производительность для преобразования точек пикселей - PullRequest
0 голосов
/ 19 февраля 2020

Так что я использую numpy и OpenCV для обработки нескольких видео. Проблема, с которой я сталкиваюсь, заключается в использовании таблицы поиска для точечного преобразования значений пикселей:

def sig(x,factor):
    if x == 255:
        return 255
    elif x!=0:
        return int(255*(1- 1/(1+(255/x -1)**(-factor))))
    else:
        return 0

def Constrast(img):
    global LUT
    for x in range(len(img)):
        for y in range(len(img[0])):
            img[x,y] = LUT[img[x,y]]
    return img

 def Enhance(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #Some other functions here
    img = Constrast(img) # This one thing takes 0.3 seconds
    #Do more stuff here

factor = .8
LUT = []
for i in range(256):
    LUT.append(sig(i,factor))
Enhance(img) # Enhancing a greyscale image

Причина, по которой я использую глобальную переменную, заключается в том, что моя функция контрастности вложена в другие функции. Я протестировал использование LUT в качестве аргумента этих функций, и оказалось, что он медленнее. Я использовал numpy массивы, словари, массивы из модуля массива и списки, причем последний самый быстрый. До сих пор я управляю 0,3 с на каждом изображении. Есть ли очевидный способ ускорить процесс прохождения пикселов?

Заранее спасибо.

1 Ответ

2 голосов
/ 19 февраля 2020

Не л oop над пикселями. Используйте функциональность OpenCV для выполнения преобразования за один вызов. Как правило, всегда старайтесь избегать зацикливания пикселей с помощью OpenCV и Python, особенно с обоими.

Пример того, как может быть адаптирован ваш код:

def Constrat(img):
    global LUT
    img = cv2.LUT(img, LUT)
    return img

См. ответ здесь и соответствующую документацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...