Skip to main content
 首页 » 编程设计

python之在 python 中使用双线性插值调整图像大小

2025年05月04日8EasonJim

我想用双线性插值调整图像大小。我找到了新的强度值,但我不知道如何使用它。下面是我编写的代码。

def resizeImageBI(im,width,height): 
    temp = np.zeros((height,width),dtype=np.uint8) 
    ratio_1 = float(im.size[0] - 1 )/ float(width - 1) 
    ratio_0 = float(im.size[1] - 1) / float(height - 1) 
    xx,yy = np.mgrid[:height, :width] 
    xmap = np.around(xx * ratio_0) 
    ymap = np.around(yy * ratio_1) 
 
for i in xrange(0, height): 
    for j in xrange(0,width): 
        temp[i][j]=im.getpixel( ( ymap[i][j], xmap[i][j]) ) * getNewIntensity(i,j,ratio_1,ratio_0) 
 
return Image.fromarray(temp) 

首先得到可变图像宽高比

lena.png 0.5 1 

Orginal image is here

That is output accorting to written code

请您参考如下方法:

我只需要为一门课做这个,我还没有评分,所以你应该在使用前检查一下。

基本插值函数

def interpolation(y0,x0, y1,x1, x): 
    frac = (x - x0) / (x1 - x0) 
    return y0*(1-frac) + y1 * frac 

第 1 步:将原始坐标映射到新调整大小的图像

def get_coords(im, W, H): 
    h,w = im.shape 
    x = np.arange(0,w+1,1) * W/w  
    y = np.arange(0,h+1,1) * H/h  
    return x,y 

第 2 步:创建一个函数以在所有行的 x 方向上进行插值。

def im_interp(im, H,W): 
    X = np.zeros(shape=(W,H)) 
    x, y = get_coords(im, W, H) 
    for i,v in enumerate(X): 
        y0_idx = np.argmax(y >i) - 1 
        for j,_ in enumerate(v): 
            # subtracting 1 because this is the first val 
            # that is greater than j, want the idx before that 
            x0_idx = np.argmax(x > j) - 1 
            x1_idx = np.argmax(j < x)  
 
            x0 = x[x0_idx] 
            x1 = x[x1_idx] 
 
            y0 = im[y0_idx, x0_idx - 1] 
            y1 = im[y0_idx, x1_idx - 1] 
 
            X[i,j] = interpolation(y0, x0, y1, x1, j) 
    return X 

第3步:使用上述步骤中的函数进行两次插值。首先在 x 方向的图像上,然后在新创建的图像(y 方向)的转置上

def im_resize(im,H,W): 
    X_lin = im_interp(im, H,W) 
    X = im_interp(X_lin.T, H,W) 
    return X_lin, X.T 

我返回两张图片只是为了看看差异。