#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