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

时间:2017-10-08 13:54:19

标签: python python-2.7 image-processing python-imaging-library resize-image

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

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

2 个答案:

答案 0 :(得分:0)

我不确定您是否想要手动执行此操作...

如果没有,scipy.mics.imresize可以做你想做的事情

答案 1 :(得分:0)

我只需要上一堂课,而且还没有评分,所以在使用前应该先检查一下。

基本插值函数

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

我退回两张图片只是为了看一下差异。