python:性能增强缩小图像

python:性能增强缩小图像,python,image,performance,numpy,Python,Image,Performance,Numpy,我已经编写了以下代码来将图像缩放到50%。然而,该算法用了65秒来缩小3264x2448图像。理解numpy的人能解释为什么这个算法如此低效,并提出更有效的修改建议吗 def shrinkX2(im): X, Y = im.shape[1] / 2, im.shape[0] / 2 new = np.zeros((Y, X, 3)) for y in range(Y): for x in range(X): new[y, x] =

我已经编写了以下代码来将图像缩放到50%。然而,该算法用了65秒来缩小3264x2448图像。理解numpy的人能解释为什么这个算法如此低效,并提出更有效的修改建议吗

def shrinkX2(im):
    X, Y = im.shape[1] / 2, im.shape[0] / 2
    new = np.zeros((Y, X, 3))
    for y in range(Y):
        for x in range(X):
            new[y, x] = im[2*y:2*y + 2, 2*x:2*x + 2].reshape(4, 3).mean(axis=0)
    return new

从问题的文本来看,你似乎将图像缩小了
50%
,而根据代码,你似乎是在分块进行。我们可以重塑以将输入的
2D
的两个轴中的每一个按长度分割为所需的块大小,以获得
4D
数组,然后沿与块大小对应的轴计算
平均值,如下所示-

def block_mean(im, BSZ):
    m,n = im.shape[:2]
    return im.reshape(m//BSZ[0],BSZ[0],n//BSZ[1],BSZ[1],-1).mean((1,3))
样本运行-

In [44]: np.random.seed(0)
    ...: im = np.random.randint(0,9,(6,8,3))

In [45]: im[:2,:2,:].mean((0,1)) # average of first block across all 3 channels
Out[45]: array([3.25, 3.75, 3.5 ])

In [46]: block_mean(im, BSZ=(2,2))
Out[46]: 
array([[[3.25, 3.75, 3.5 ],
        [4.  , 4.5 , 3.75],
        [5.75, 2.75, 5.  ],
        [3.  , 3.5 , 3.25]],

       [[4.  , 5.5 , 5.25],
        [6.25, 1.75, 2.  ],
        [4.25, 2.75, 1.75],
        [2.  , 4.75, 3.75]],

       [[3.25, 3.5 , 5.25],
        [4.25, 1.5 , 5.25],
        [3.5 , 3.5 , 4.25],
        [0.75, 5.  , 5.5 ]]])

好的,这看起来适用于灰度图像。那彩色(r,g,b)频道呢?天哪!你的代码不到2秒!“我做错了什么?”乔纳森用NumPy数组循环不是最好的选择。我们正在使用NumPy阵列支持的函数和重塑,使其矢量化,从而获得性能。嘿,我还有一个函数,我想让您看看,看看是否可以让它更快一点。发布问题后,我会在这里发布链接。好的,如果你愿意,看看这个问题:@Divakar我正在使用cv2导入形状(Y,X,3)中的彩色图像。