Python 图像在numpy中的Mipmap?

Python 图像在numpy中的Mipmap?,python,numpy,Python,Numpy,我想问一下,是否有一个简洁的numpy解决方案可以使用双线性过滤来调整2D numpy数组(这是一个图像)的大小 更具体地说,我的数组具有形状(宽度、高度、4)(如rgba图像中所示)。降尺度也仅在“偶数”步骤上进行:即从(w,h,4)到(w/2,h/2,4)到(w/4,h/4,4)等 我已经浏览了很长一段时间了,但每个人似乎都提到了imresize的scipy/PIL版本 我希望尽量减少对python软件包的依赖性,因此只需要numpy 我只是想检查一下,然后在C++中实现它。< p>我认为在

我想问一下,是否有一个简洁的numpy解决方案可以使用双线性过滤来调整2D numpy数组(这是一个图像)的大小

更具体地说,我的数组具有形状(宽度、高度、4)(如rgba图像中所示)。降尺度也仅在“偶数”步骤上进行:即从(w,h,4)到(w/2,h/2,4)到(w/4,h/4,4)等

我已经浏览了很长一段时间了,但每个人似乎都提到了imresize的scipy/PIL版本

我希望尽量减少对python软件包的依赖性,因此只需要numpy


我只是想检查一下,然后在C++中实现它。

< p>我认为在NUMPY中没有任何具体的解决方案,但是你应该能够有效地实现它,而不必放弃Python的舒适性。如果我错了,请纠正我,但是当图像的大小可以被2整除时,双线性滤波器基本上与平均原始图像的4个像素得到新图像的1个像素相同,对吗?如果图像大小是2的幂,则以下代码:

from __future__ import division
import numpy as np
from PIL import Image

def halve_image(image) :
    rows, cols, planes = image.shape
    image = image.astype('uint16')
    image = image.reshape(rows // 2, 2, cols // 2, 2, planes)
    image = image.sum(axis=3).sum(axis=1)
    return ((image + 2) >> 2).astype('uint8')

def mipmap(image) :
    img = image.copy()
    rows, cols, planes = image.shape
    mipmap = np.zeros((rows, cols * 3 // 2, planes), dtype='uint8')
    mipmap[:, :cols, :] = img
    row = 0
    while rows > 1:
        img = halve_image(img)
        rows = img.shape[0]
        mipmap[row:row + rows, cols:cols + img.shape[1], :] = img
        row += rows
    return mipmap

img = np.asarray(Image.open('lena.png'))
Image.fromarray(mipmap(img)).save('lena_mipmap.png')
生成此输出:

原始映像为512x512,在我的系统上以以下方式运行:

In [3]: img.shape
Out[3]: (512, 512, 4)

In [4]: %timeit mipmap(img)
10 loops, best of 3: 154 ms per loop

如果出现奇数长度的边,这将不起作用,但具体取决于您希望如何处理这些情况下的下采样,您应该能够去除整行(或整列)像素,将图像重塑为
(行//2,2,列//2,2,平面)
,以便
img[r,:,c,:,p]
是一个2x2的值矩阵,需要插值以获得新的像素值。

谢谢Jaime!它工作得非常好!而且它也相当优雅:)