Как я мог увеличить скорость - PullRequest
0 голосов
/ 15 октября 2019

Я использую приведенный ниже код для исследования, связанного с обработкой изображений. Код прекрасно работает как функциональность, но он слишком медленный, чтобы один шаг занимал до 10 секунд.

Мне нужна более быстрая скорость процесса для достижения цели.

import numpy
import glob, os
import cv2
import os
    input = cv2.imread(path)

    def nothing(x):  # for trackbar
        pass


    windowName = "Image"

    cv2.namedWindow(windowName)
    cv2.createTrackbar("coef", windowName, 0, 25000, nothing)

    condition = True
    while (condition):
        coef = cv2.getTrackbarPos("coef", windowName)
        temp_img = input
        row = temp_img.shape[0]
        col = temp_img.shape[1]
        print(coef)
        red = []
        green = []
        for i in range(row):
            for y in range(col):
               # temp_img[i][y][0] = 0
                temp_img[i][y][1] = temp_img[i][y][1]* (coef / 100)
                temp_img[i][y][1] = temp_img[i][y][2] * (1 - (coef / 100))
                # relative_diff = value_g - value_r

        # temp =cv2.resize(temp,(1000,800))
        cv2.imshow(windowName, temp_img)
        # cv2.imwrite("output2.jpg", temp)
        print("fin")
        # cv2.waitKey(0)
        if cv2.waitKey(30) >= 0:
            condition = False
    cv2.destroyAllWindows()

Есть ли кто-нибудьидея с более быстрым результатом на цель?

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Я делаю такие вещи в nip2 . Это электронная таблица обработки изображений, которая может быстро манипулировать огромными изображениями. У него нет проблем с выполнением операций такого типа на изображении любого размера со скоростью 60 кадров в секунду.

Я сделал вам пример рабочего пространства: http://www.rollthepotato.net/~john/coeff.ws

Вот как это выглядит при работе с изображением звездного поля 1 ГБ:

enter image description here

Вы можете перетащить ползунок, чтобы изменить coeff. Обработанное изображение обновляется мгновенно при перетаскивании. Вы можете масштабировать и перемещать обработанное изображение, чтобы проверить детали и отрегулировать coeff.

Основная библиотека обработки изображений: libvips , которая имеет привязку Python, pyvips . В pyvips ваша программа будет выглядеть так:

import pyvips

def adjust(image, coeff):
    return image * [1, coeff / 100, 1 - coeff / 100]

Хотя, конечно, без элементов GUI.

0 голосов
/ 15 октября 2019

Мне не совсем понятно, что именно представляет собой объект temp_img, но если он ведет себя как массивный массив, вы можете заменить ваш цикл на

temp_img[:,:,0] = temp_img[:,:,1]*(coef/100)
temp_img[:,:,1] = temp_img[:,:,2]*(1-coef/1000)

, что должно привести к значительному ускорению, если ваш массивбольшой. Реализация таких операций над массивами оптимизирована очень хорошо, тогда как циклы Python, как правило, довольно медленные.

Редактирование на основе комментариев: поскольку вы работаете с большими изображениями и у вас есть некоторые дорогостоящие операции, которые требуют немасштабируемой версии, но должны выполняться только один раз, ваш код может получить следующую структуру

import... #do all your imports

def expensive_operations(image, *args, **kwargs):
    #do all your expensive operations like object detection

def scale_image(image, scale):
    #create a scaled version of image

def cheap_operations(scaled_image, windowName):
    #perform cheap operations, e.g.
    coef = cv2.getTrackbarPos("coef", windowName)
    temp_img = np.copy(scaled_image)
    temp_img[:,:,1] = temp_img[:,:,1]* (coef / 100)
    temp_img[:,:,2] = temp_img[:,:,2] * (1 - (coef / 100))
    cv2.imshow(windowName, temp_img)



input = cv2.imread(path)
windowName = "Image"

cv2.namedWindow(windowName)
cv2.createTrackbar("coef", windowName, 0, 25000, nothing)

condition = True

expensive_results = expensive_operations(input) #possibly with some more args and keyword args
scaled_image = scale_image(input)

while condition:
    cheap_operations(scaled_image, windowName)
    if cv2.waitKey(30) >= 0:
        condition = False

cv2.destroyAllWindows()

...