插值法(最邻近,双线性,双三次)的原理及实现

article/2025/9/23 16:37:11

插值法(最邻近,双线性,双三次)的原理及实现

常用的插值方法有最邻近插值法、双现象插值法和双三次插值法等,主要用于图像的放大或缩小。

缩小图像(或称为下采样(subsampled) 或降采样(downsampled) ) 的主要目的有两个: 1、 使得图像符合显示区域的大小; 2、 生成对应图像的缩略图。

放大图像(或称为上采样(upsampling) 或图像插值(interpolating) ) 的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。

一、最邻近插值法

最邻近插值(The nearest interpolation)即是选取一个最靠近的像素为它的像素值,这是最简单的一种插值方法,不需要计算。在待求像素的四邻像素中,将距离待求像素最近的邻接像素灰度值赋予待求像素。设i+u, j+v (i, j为正整数, u, v为大于零小于1的小数, 下同)为待求象素坐标, 则待求象素灰度的值 f(i+u, j+v) 如下图所示:

如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。

特点:最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

代码块:

import cv2
import numpy as np
def function(img):height,width,channels =img.shapeemptyImage=np.zeros((800,800,channels),np.uint8)sh=800/heightsw=800/widthfor i in range(800):for j in range(800):x=int(i/sh)y=int(j/sw)emptyImage[i,j]=img[x,y]return emptyImageimg=cv2.imread("lenna.png")
zoom=function(img)
print(zoom.shape)
cv2.imshow("nearest interp",zoom)
cv2.imshow("image",img)
cv2.waitKey(0)

二、双线性插值法

双线性插值(Bilinear interpolation):已知X-Y平面内四个像素点的坐标 (x0, y0) 、(x1, y0)、(x0, y1) (x1, y1),要得到四点构成 区间内某一点上的像素值。

2.1单线性插值

由简入难,先了解下单线性插值的原理:

已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值。如下图所示:

单线性插值用一句话概括就是用x和x0,x1的距离作为一个权重,用于y0和y1的加权。双线性插值本质上就是在两个方向上做线性插值。

2.2双线性插值

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。如下图所示:

假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1), Q12 = (x1, y2), Q21 = (x2, y1) , Q22 = (x2, y2) 四个点的值。最常见的情况,f就是一个像素点的像素值。分别在 x 、y方向做两次单线性插值,得到:

由于图像双线性插值只会用相邻的4个点, 因此上述公式的分母都是1。

特点:1、如果源图像和目标图像的原点(0, 0) 均选择左上角, 然后根据插值公式计算目标图像每点像素, 假设你需要将一幅5x5的图像缩小成3x3, 那么源图像和目标图像各个像素之间的对应关系如下:
在这里插入图片描述
即如果源图像和目标图像的原点(0, 0) 均选择左上角(或者右下角),那么有可能能会出现最右边和最下边的像素实际上并没有参与计算,而且目标图像的每个像素点计算出的灰度值也相对于源图像偏左偏上的情况。如果要解决这一问题,就需要将源图像和目标图像几何中心的对齐。
在这里插入图片描述

要通过双线性插值的方法计算出dst中每一个像素点的像素值,需要通过dst像素点的坐标对应到src图像当中的坐标,然后通过双线性插值的方法算出src中相应坐标的像素值。二者的坐标对应关系为:

srcX=dstX* (srcWidth/dstWidth) ,

srcY = dstY * (srcHeight/dstHeight)

考虑到如果将源图像和目标图像几何中心的对齐,如保持src图像不动,仅移动dst图像,则移动距离一定是1/2*(src_size-dst_size),那么上式可以修正为:

srcX=dstX* (srcWidth/dstWidth)+0.5*(srcWidth/dstWidth-1)

srcY = dstY* (srcHeight/dstHeight)+0.5*(srcHeight/dstHeight-1)

证明过程如下:
在这里插入图片描述
2、双线性插值运算过程存在着大量的浮点数运算,相对而言是一个较为耗时的过程,直接进行计算的话,由于计算的srcX和srcY 都是浮点数,后续会进行大量的乘法,而图像数据量又大,速度不会理想,解决思路是:浮点运算→→整数运算→→”<<左右移按位运算”。

3、没有灰度不连续的缺点, 图像看起来更光滑。

代码块:

import numpy as np
import cv2'''
python implementation of bilinear interpolation
''' 
def bilinear_interpolation(img,out_dim):src_h, src_w, channel = 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):# find the origin x and y coordinates of dst image x and y# use geometric center symmetry# if use direct way, src_x = dst_x * scale_xsrc_x = (dst_x + 0.5) * scale_x-0.5src_y = (dst_y + 0.5) * scale_y-0.5# find the coordinates of the points which will be used to compute the interpolationsrc_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)# calculate the interpolationtemp0 = (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_imgif __name__ == '__main__':img = cv2.imread('lenna.png')dst = bilinear_interpolation(img,(700,700))cv2.imshow('bilinear interp',dst)cv2.waitKey()

三、双三次插值法

双三次插值又称立方卷积插值。三次卷积插值是一种更加复杂的插值方式。该算法利用待采样点周围16个点的灰度值作三次插值,不仅考虑到4 个直接相邻点的灰度影响,而且考虑到各邻点间灰度值变化率的影响。三次运算可以得到更接近高分辨率图像的放大效果,但也导致了运算量的急剧增加。

数学原理如下:
在这里插入图片描述

特点:双三次曲线插值方法计算量最大,但后的图像效果最好。这种算法是一很常见的算法,普遍用在图像编辑软件、打印机驱动和数码相机上。

代码块参考资料:https://blog.csdn.net/u013185349/article/details/84841202?utm_term=python%E6%9C%80%E9%82%BB%E8%BF%91%E6%8F%92%E5%80%BC&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-2-84841202&spm=3001.4430

参考资料:
最邻近插值法:
https://blog.csdn.net/qq_25015749/article/details/106288238

双线性插值法:
https://blog.csdn.net/weixin_36670529/article/details/103125041
https://www.cnblogs.com/yssongest/p/5303151.html

双三次插值法:
https://blog.csdn.net/nandina179/article/details/85330552
https://blog.csdn.net/qq_29058565/article/details/52769497
https://blog.csdn.net/u013185349/article/details/84841202?utm_term=python%E6%9C%80%E9%82%BB%E8%BF%91%E6%8F%92%E5%80%BC&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-2-84841202&spm=3001.4430


http://chatgpt.dhexx.cn/article/upieWjM4.shtml

相关文章

表示关系x =y =z的c语言表达式为________.,为表示关系x≥y≥z,应使用C语言表达式____。...

为表焦距决定了画面的透视关系。 示关使用GREGRE ≥y≥桡神经沟位于 应C语言表关于脊柱正确的描写是() 建筑物或者其他设施以及建筑物上的搁置物、达式悬挂物发生( )造成他人损害的&#xff0c;所有人或者管理人应当承担民事责任,但能够证明自己没有过错的除外。 为表成对的脑颅…

C语言运算表达式整理

C语言的运算规则是按照运算符的优先级进行的&#xff0c;所以我们首先看一下C的运算优先级别 总结 最简单的优先级就是 算数运算符>关系运算符>逻辑运算符>赋值运算符 然后我们还要了解一个短路规则&#xff08;特性&#xff09; 短路规则&#xff1a;在整个逻辑表…

与数学式子对应的C语言表达式是(),与数学式子3乘以x的n次方/(2x-1)对应的C语言表达式是...

满意答案 lengwei241 2013.03.25 采纳率:43% 等级:13 已帮助:11778人 18 与数学式子3乘以x的n次方/(2x-1)对应的C语言表达式是 3*x^n/(2*x-1) 3*x**n/(2*x-1) 3*pow(x,n)*(1/(2*x-1)) 3*pow(n,x)/(2*x-1) 答案是3*pow(x,n)*(1/(2*x-1)) 为什么 解答:其中pow(x,n)为C语言…

C语言表达式和表达式的值

今天突然发现如果能很好的理解表达式和表达式的值的概念&#xff0c;可以使编程代码变的更整洁。很多时候我们总是忘记从最基本的概念开始考虑问题。我觉得我们有必要把C/C标准看下&#xff0c;在里面肯定有很多我们一直困惑的问题的答案。 C语言是基于结构化程序设计思想的程序…

以下c语言表达式与代数式计算结果,设有定义:float a=2,b=4,h=3;,以下C语言表达式中与代数式计算结果不相符的是...

设有定义:float a=2,b=4,h=3;,以下C语言表达式中与代数式计算结果不相符的是 设有式计算结Women in Britain, having some qualifications, were enfranchised until ______. 定义达式代数The usual rhyme scheme for the English or Shakespearean sonnet is( ). In “For …

与数学式对应的c语言表达式为,数学表达式“|x|4”对应的C语言表达式是“x-4||x4”。...

数学表达式“|x|4”对应的C语言表达式是“x-4||x4”。 数学式《莺莺传》故事的时代为( ) 表达人力资本的投资是提高技术水平的必要途径。() 对达式教育投资是人力资本的投资唯一重点。() 微商是以移动终端为载体&#xff0c;应的C语言表通过社交媒介手段&#xff0c;进行传播的…

C语言 运算符、表达式

运算符、表达式 1、 C语言运算符 算术运算符和算术表达式 &#xff08;加&#xff09;、—&#xff08;减&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;取余&#xff0c;也叫模运算符&#xff0c;该运算符两侧都要求为整数&#xff…

c语言表达式语法问题,c语言表达式语法规则是什么_后端开发

c语言统计单词个数的方法_后端开发 在一篇文章中单词都是用空格隔开的&#xff0c;所以单词个数空格数1&#xff0c;c语言统计单词个数实际上转换成了统计文章中的空格数&#xff0c;可以用while和if来进行统计。 c语言表达式语法规则是什么 C语言表达式语法规则如下&#xff1…

c语言表达式成立,若有int y;则表示命题“y是偶数”成立的c语言表达式是多少...

满意答案 hoome_09 2017.12.28 采纳率&#xff1a;44% 等级&#xff1a;8 已帮助&#xff1a;263人 1. 若有int y&#xff1b;则表示命题“y是奇数”成立的C语言表达式是 (y%2 1) 。 2. 在C语言中&#xff0c;表示逻辑“真”值用(true) 表示。 3. 条件“2&#xff1c;x&…

C语言表达式用法快来看看

点击上方蓝字关注我&#xff0c;了解更多咨询 表达式是C语言的主体。在C语言中&#xff0c;表达式由操作符和操作数组成。最简单的表达式可以只含有一个操作数。根据表达式所含操作符的个数&#xff0c;可以把表达式分为简单表达式和复杂表达式两种&#xff0c;简单表达式是只含…

数学式子对应的c语言表达式是,把数学式写成C语言表达式

(1) 3.26*exp(x)1.0/3.0*pow((ab), 4) (2) 2*sqrt(x)(ab)/(3.0*sin(x)) (3) g*m1*m2/(r*r) (4) double pi 3.14 2.0*pi*r pi*r*r cos(45.0*pi / 180.0 ) (5) loan * rate * pow( (1rate) , month ) / ( pow( (1rate) , month) - 1) 扩展资料&#xff1a; 指针&#xff1a; 如…

C语言表达式专练

1、以下表达式值为3的是 A)16-13%10 B)23/2 C)14/3-2 D)(26)/(12-9) 2、设有说明语句:int k7&#xff0c;x12;则以下能使值为3的表达式是 A) x%(k%5) B)x%(k-k%5) C)x%k-k%5 D)(x%k)-(k%5) 3、若x、i、j和k都是int型变量&#xff0c;则执行表达式x(i4,j16,k32)后x的值为 A&…

快速求组合数

摘自https://www.jianshu.com/p/718a5ac26238 逆元快速幂解法 &#xff08;一&#xff09;基本概念 上面两种方法都使用了递归方法&#xff0c;递归方法有个缺陷&#xff0c;就是在数据较大时效率较低。所以这里要介绍一个种新的求组合算法。在了解此算法之前&#xff0c;要先了…

Java计算组合数以及生成组合排列

前言 组合数计算 公式法 逐个相除法(错误) 逐个相除法修正版 素数幂乘法 基本公式法 平方差连乘法 组合恒等法 简单递归法 杨辉三角法 杨辉三角优化法 二进制法 组合数计算小结 获取数组的组合排列 二进制法 基本迭代法 从后向前迭代法&#xff08;Matlab版本…

[组合] 组合数计算四大算法模板(模板+卢卡斯定理)

文章目录 0. 前言1. 预处理组合数组合递推式2. 预处理阶乘逆元3. 卢卡斯定理4. 高精度组合数 0. 前言 组合数求解有很多种方式&#xff0c;不同的方式对应这不同的时间复杂度&#xff0c;难以程度也是不尽相同。根据数据范围选择对应的方法即可。 1. 预处理组合数组合递推式 …

组合数

1、定义&#xff1a;从m个不同元素中&#xff0c;任取n(n≤m)个元素并成一组&#xff0c;叫做从m个不同元素中取出n个元素的一个组合&#xff1b;从m个不同元素中取出n(n≤m)个元素的所有组合的个数&#xff0c;叫做从m个不同元素中取出n个元素的组合数。 2、公式&#xff1a;…

组合数取模总结

题目描述&#xff1a; 在ACM竞赛现在叫JB竞赛&#xff1f;中&#xff0c;经常会遇到组合数取模的题目&#xff1b;就我现在的水平而言&#xff0c;大概分为以下三类&#xff0c;以后遇到新的方法会在做补充&#xff1b; 第一种&#xff1a; n和m都较小 &#xff08;<1000&a…

逆元求组合数

逆元简介 同余符号 ≡ 先bb一下 ≡&#xff0c;这个符号有三个意思&#xff0c;再这里用到的意思为“同余符号”。≡ 的介绍 两个整数a&#xff0c;b&#xff0c;若它们除以整数m所得的余数相等&#xff0c;则称a&#xff0c;b对于模m同余 记作a≡b(mod m) 读作a同余于b模m&am…