使用Python进行双线性插值调整图像大小

4

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

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

这是原始图片

这是根据编写的代码生成的输出结果

2个回答

1

我只是为了课程需要做这个,但我还没有被评分,所以在使用之前你应该先检查一下。

基本插值函数

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

步骤三:使用上一步的函数进行两次插值。首先在图像的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

我返回两张图片只是为了看看它们的区别。


-2

我不确定你是否想手动进行这个练习...

如果不是的话,有scipy.mics.imresize可以实现你想要的功能。


我知道有一个函数可以做到这个,但是像你说的,我想试一下练习。 - Can Çalışkan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接