(二)双线性插值python实现
实现双线性插值
·
(一)原始图像
(二)双线性插值原理
一般情况下我们对图像缩放的时候会进行上采样或下采样,上采样常采用插值来实现,本文章使用双线性插值实现图像放大
双线性插值的核心思想是在两个方向上分别进行一次插值,关于下图的解释可以参考百度百科:双线性插值
使用双线性插值注意将目标图形和原图像几何中心重合在计算插值,双线性插值只会使用临近的四个像素点坐标,先求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.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. 工程文件
更多推荐
所有评论(0)