Билинейная интерполяция с использованием многопроцессорной и общей памяти
Я хотел выполнить билинейную интерполяцию на очень большом изображении (>20 МБ). Обычный код занимает очень много времени. Я пытался сделать его многопроцессорным, но в результате, кажется, появляется только последний столбец пикселей. Извините, если это нубский вопрос.
def GetBilinearPixel(imArr,r,c, posX, posY,enlargedShape):
out=[]
modXi = int(posX)
modYi = int(posY)
modXf = posX - modXi
modYf = posY - modYi
modXiPlusOneLim = min(modXi+1,imArr.shape[1]-1)
modYiPlusOneLim = min(modYi+1,imArr.shape[0]-1)
for chan in range(imArr.shape[2]):
bl = imArr[modYi, modXi, chan]
br = imArr[modYi, modXiPlusOneLim, chan]
tl = imArr[modYiPlusOneLim, modXi, chan]
tr = imArr[modYiPlusOneLim, modXiPlusOneLim, chan]
b = modXf * br + (1. - modXf) * bl
t = modXf * tr + (1. - modXf) * tl
pxf = modYf * t + (1. - modYf) * b
out.append(int(pxf))
enlargedShape[r, c]=out
if __name__ == '__main__':
im = cv.imread('new.jpeg')
#print im.shape
#manager = multiprocessing.Manager()
size=map(int, [im.shape[0]*2, im.shape[1]*2, im.shape[2]])
print size
enlargedShape=sharedmem.full(size, 0, dtype=np.uint8)
#print enlargedShape
#enlargedShape = list(map(int, [im.shape[0]*2, im.shape[1]*2, im.shape[2]]))
rowScale = float(im.shape[0]) / float(enlargedShape.shape[0])
colScale = float(im.shape[1]) / float(enlargedShape.shape[1])
#My Code starts her
jobs = []
for r in range(enlargedShape.shape[0]):
for c in range(enlargedShape.shape[1]):
orir = r * rowScale
oric = c * colScale
#enlargedImg[r, c] = GetBilinearPixel(im, oric, orir)
#My code
p = multiprocessing.Process(target=GetBilinearPixel, args=(im,r,c, oric, orir,enlargedShape))
jobs.append(p)
p.start()
p.join()
print enlargedShape
cv.imshow("cropped",enlargedShape)
cv.waitKey(0)
Есть ли альтернативные способы оптимизации кода?
1 ответ
Если вы серьезно относитесь к решению этой проблемы, изучите среду трехмерной графики, такую как OpenGL или DirectX, и позвольте графическому процессору выполнить эту работу. Отображение текстуры в графическом процессоре - это функция, которая отображает изображение любого размера, изображения любой формы с помощью аппаратно-ускоренной интерполяции, что происходит практически мгновенно.
Также вам может понадобиться использовать закадровый рендеринг, чтобы вернуть результат в основную память. Передача изображений назад и вперед может занять некоторое время, но это должно быть намного быстрее, чем делать все в CPU.