Работа с изображениями быстрее в python

#python #python-3.x #image

Вопрос:

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

 import cv2 as cv
import numpy as np


img = cv.imread('Capture.jpg')
out = cv.normalize(img.astype('float'), None, 0.0, 1.0, cv.NORM_MINMAX)
h, w, c = img.shape
out_img = np.zeros((h, w, c))
for i in range(h):
    for j in range(w):
        ma = max(out[i, j])
        mi = min(out[i, j])
        if ma != 0 and mi !=0:
            out_img[i, j] = (mi/ma)*out[i, j]
        else:
            out_img[i, j] = out[i, j]

 

Вот я просматриваю все изображение целиком, есть ли способ сделать это быстрее? Спасибо

Комментарии:

1. Может ли помочь Tensorflow, особенно если на вашем компьютере установлен графический процессор?

2. Взгляните на docs.opencv.org/master/dc/d71/tutorial_py_optimization.html

Ответ №1:

Из того, что я понимаю в вашем коде, предположим, что у нас есть 2d-массив(что вы делаете с размером «c», цветовыми каналами?)

 import numpy as np
x = np.random.rand(4,3)
ma=np.max(x, axis=1)
mi=np.min(x, axis=1)
y=np.zeros((4,3))
ma=np.expand_dims(ma, axis=1)
mi=np.expand_dims(mi, axis=1)
y = x*(ma/mi)
 

Достаточно ли этого?

Ответ №2:

Вы можете использовать векторизацию numpy. Я верю, что это сделает это:

 # ...
h, w, c = img.shape

mi = np.min(img, axis=2)
ma = np.max(img, axis=2)

# there's probably a better way than reshape
ratio = np.reshape([mi / ma] * c, (h, w, c))
mask = np.reshape([(mi != 0) amp; (ma != 0)] * c, (h, w, c))

out_img = mask * ratio * img   ~mask * img