【问题标题】:resize image with bilinear interpolation in python在python中使用双线性插值调整图像大小
【发布时间】:2018-03-19 19:14:03
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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
    

    第 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
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我知道有这个功能,但正如你所说的尝试锻炼
      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多