利用插值算法进行上采样和下采样

1.最邻近插值 The nearest interpolation

原理:划分四个区域,将某点值赋给区域的所有值

def the_nearest_interpolation(img, nh, nw):
    h, w, c = img.shape     # h是height,w是width,c是channels
    emptyImage = np.zeros((nh, nw, c), np.uint8)
    sh = nh/h
    sw = nw/w
    for i in range(nh):
        for j in range(nw):
            x = int(i/sh)
            y = int(j/sw)
            emptyImage[i, j] = img[x, y]
    return emptyImage

2.双线性插值

原理:利用两次单线性计算点

def bilinear_interpolation(img,out_dim):
    src_h, src_w, channel = img.shape       # 原参数
    dst_h, dst_w = out_dim[1], out_dim[0]   # 目标参数
    
    if src_h == dst_h and src_w == dst_w:
        return img.copy()
        
    # 创建目标图像
    dst_img = np.zeros((dst_h, dst_w, 3), dtype=np.uint8)
    
    # 计算写x,y比
    scale_x, scale_y = float(src_w) / dst_w, float(src_h) / dst_h
    for i in range(3):
        for dst_y in range(dst_h):
            for dst_x in range(dst_w):
                # 平移得到几何中心
                src_x = (dst_x + 0.5) * scale_x-0.5
                src_y = (dst_y + 0.5) * scale_y-0.5
 
                # 找到中心点旁用于计算的点
                src_x0 = int(np.floor(src_x))
                src_x1 = min(src_x0 + 1 ,src_w - 1)
                src_y0 = int(np.floor(src_y))
                src_y1 = min(src_y0 + 1, src_h - 1)
 
                # 计算插值
                temp0 = (src_x1 - src_x) * img[src_y0,src_x0,i] + (src_x - src_x0) * img[src_y0,src_x1,i]
                temp1 = (src_x1 - src_x) * img[src_y1,src_x0,i] + (src_x - src_x0) * img[src_y1,src_x1,i]
                dst_img[dst_y,dst_x,i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)
 
    return dst_img
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值