这里写目录标题
- (一)原始图像
- (二)双线性插值原理
- (三)python实现
- 1. 安装库
- 2. python程序编写
- 3. 效果
- 4. 工程文件
(一)原始图像
(二)双线性插值原理
一般情况下我们对图像缩放的时候会进行上采样或下采样,上采样常采用插值来实现,本文章使用双线性插值实现图像放大
双线性插值的核心思想是在两个方向上分别进行一次插值,关于下图的解释可以参考百度百科:双线性插值
使用双线性插值注意将目标图形和原图像几何中心重合在计算插值,双线性插值只会使用临近的四个像素点坐标,先求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实现
python安装可以参考:python安装
1. 安装库
首先我们需要安装用到的库,按住win+r输入cmd打开dos窗口,输入下面的命令
pip install opencv-python
pip install numpy
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.shapedst_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_hfor 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.5src_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_imgimg = 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. 工程文件
线性插值函数