0

我想对一个非常大的图像(> 20Mb)执行双线性插值。常规代码需要很长时间。我尝试将其设为多处理,但在结果中,似乎只出现了最后一列像素。对不起,如果这是一个菜鸟问题。

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)

是否有任何替代方法来优化代码?

4

1 回答 1

0

如果你认真解决这个问题,请学习 OpenGL 或 DirectX 等 3D 图形框架,让 GPU 完成工作。GPU 的纹理映射是使用硬件加速插值将图像映射到任何大小、任何形状的图像的功能,这几乎是即时发生的。

此外,您可能必须使用屏幕外渲染将渲染结果带回主内存。来回传输图像可能需要一些时间,但它应该比在 CPU 中执行所有操作要快得多。

OpenGL 纹理映射

如何在 OpenGL 上渲染屏幕外?

于 2019-02-28T01:59:08.597 回答