(二)双线性插值python实现

这里写目录标题

      • (一)原始图像
      • (二)双线性插值原理
      • (三)python实现
          • 1. 安装库
          • 2. python程序编写
          • 3. 效果
          • 4. 工程文件

(一)原始图像

(二)双线性插值python实现_第1张图片

(二)双线性插值原理

一般情况下我们对图像缩放的时候会进行上采样或下采样,上采样常采用插值来实现,本文章使用双线性插值实现图像放大
双线性插值的核心思想是在两个方向上分别进行一次插值,关于下图的解释可以参考百度百科:双线性插值
(二)双线性插值python实现_第2张图片

使用双线性插值注意将目标图形和原图像几何中心重合在计算插值,双线性插值只会使用临近的四个像素点坐标,先求x的单线性插值,再求y的单线性插值
这里举例来说明:

关于中心对齐可以参考:双线性插值,个人认为上面中心对齐时+0.5是因为图像坐标从0开始,所以对于33的图像只有(0 1 2)对应到55的图像(0 1 2 3 4),它们的宽高比为5/3,对于33的2只能到25/3=3.3,永远到不了4这个地方,只能先+0.5才能到4,(2+0.5)*5/3=4.1(二)双线性插值python实现_第3张图片

(三)python实现

python安装可以参考:python安装

1. 安装库

首先我们需要安装用到的库,按住win+r输入cmd打开dos窗口,输入下面的命令

pip install opencv-python
pip install numpy

(二)双线性插值python实现_第4张图片

2. python程序编写
import cv2 # cv2 即opencv的库
import numpy as np #给numpy起别名np,该库Numerical Python是python的数学函数库

#双线性插值实现
def bilinear_interpolation(img,out_dim):
    src_h,src_w,channels = img.shape
    dst_h,dst_w = out_dim[1],out_dim[0]
    print("src_h,src_w= ",src_h,src_w)
    print("dst_h,dst_w= ",dst_h,dst_w)
    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)
    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


img = cv2.imread("lenna.png")
dst = bilinear_interpolation(img,(700,700))
cv2.imshow("blinear",dst)
cv2.waitKey()

3. 效果

打印信息:

======= RESTART: D:\AI\opencv\opencv\interpolation\bilinear_interpolation.py ======
src_h,src_w=  512 512
dst_h,dst_w=  700 700

4. 工程文件

线性插值函数

你可能感兴趣的:(AI,python,AI,机器学习)