双三次插值及Matlab实现

article/2025/9/23 16:10:50

双三次插值及Matlab实现

一、简单实例

  采用简单实例进行对双三次插值的介绍,由于双三次插值对于目标图像的某一像素进行估计时,所采用的像素信息为其周围16个像素点信息,因此不同于最近邻插值和双线性插值,此时假设有 5 × 5 5\times5 5×5大小的灰度图 s r c src src,如下所示:
[ 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 0.5 ] \left[\begin{array}{ccc} 0.1&0.1&0.1&0.1&0.1\\ 0.2&0.2&0.2&0.2&0.2\\ 0.3&0.3&0.3&0.3&0.3\\ 0.4&0.4&0.4&0.4&0.4\\ 0.5&0.5&0.5&0.5&0.5 \end{array}\right] 0.10.20.30.40.50.10.20.30.40.50.10.20.30.40.50.10.20.30.40.50.10.20.30.40.5目标图像 d s t dst dst期望大小为 7 × 7 7\times7 7×7,则若要构建原始图像与目标图像之间的对应关系,根据之前的论述(最近邻插值及Matlab实现,后续有关扩展原始图像的内容也参看此篇),其映射公式为:
{ s r c X = ( d s t X + 0.5 ) × ( s r c W i d t h / d s t W i d t h ) − 0.5 s r c Y = ( d s t Y + 0.5 ) × ( s r c H e i g h t / d s t H e i g h t ) − 0.5 \left\{\begin{array}{l} srcX=(dstX+0.5)\times(srcWidth/dstWidth) - 0.5 \\ srcY=(dstY+0.5)\times(srcHeight/dstHeight)-0.5 \end{array}\right. {srcX=(dstX+0.5)×(srcWidth/dstWidth)0.5srcY=(dstY+0.5)×(srcHeight/dstHeight)0.5其中 s r c X srcX srcX s r c Y srcY srcY分别为目标图像 d s t X dstX dstX d s t Y dstY dstY处所对应的原图像坐标,那么,假设现需要求解目标图像坐标为 ( 4 , 4 ) (4,4) (4,4)位置处,即为目标图像中心处的像素估计值,则有:
{ s r c X = ( 4 + 0.5 ) × ( 5 / 7 ) − 0.5 = 2.714 s r c Y = ( 4 + 0.5 ) × ( 5 / 7 ) − 0.5 = 2.714 \left\{\begin{array}{l} srcX=(4+0.5)\times(5/7)-0.5=2.714 \\ srcY=(4+0.5)\times(5/7)-0.5=2.714 \end{array}\right. {srcX=(4+0.5)×(5/7)0.5=2.714srcY=(4+0.5)×(5/7)0.5=2.714双三次插值所使用的像素信息为所计算的对应原始图像位置处周围的16个像素点,由于此时计算所得的坐标为 ( 2.714 , 2.714 ) (2.714,2.714) (2.714,2.714),因此其所对应的16个像素如下图所示:
在这里插入图片描述

红色点处即为所求点。双三次插值使用BiCubic基函数,其定义如下:
W ( x ) = { ( a + 2 ) ∣ x ∣ 3 − ( a + 3 ) ∣ x ∣ 2 + 1 for |x|  ⩽ 1 a ∣ x ∣ 3 − 5 a ∣ x ∣ 2 + 8 a ∣ x ∣ − 4 a for 1<|x|<2 0 otherwise W(x)= \left\{\begin{array}{ll} (a+2)|x|^3-(a+3)|x|^2+1&\text{for |x| }\leqslant1\\ a|x|^3-5a|x|^2+8a|x|-4a&\text{for 1<|x|<2}\\ 0&\text{otherwise} \end{array}\right. W(x)=(a+2)x3(a+3)x2+1ax35ax2+8ax4a0for |x| 1for 1<|x|<2otherwise其中参数 a a a为常系数,常取 a = − 0.5 a=-0.5 a=0.5;变量 x x x为红色点与16个对应像素之间的横向或纵向距离。双三次插值需要求解 x x x y y y两个方向上的权值,以左上方第一个像素点为例:①横向距离为 x = 1.724 x=1.724 x=1.724,则 W ( x ) = ( − 0.5 ) ∣ 1.724 ∣ 3 − 5 ( − 0.5 ) ∣ 1.724 ∣ 2 + 8 ( − 0.5 ) ∣ 1.724 ∣ − 4 ( − 0.5 ) = − 0.0276 W(x)=(-0.5)|1.724|^3-5(-0.5)|1.724|^2+8(-0.5)|1.724|-4(-0.5)=-0.0276 W(x)=(0.5)1.72435(0.5)1.7242+8(0.5)1.7244(0.5)=0.0276;②纵向距离为 y = 1.724 y=1.724 y=1.724,则 W ( y ) = − 0.0276 W(y)=-0.0276 W(y)=0.0276;③第一个像素点对估计点造成的影响,即其权重则为 W ( 1 ) = W ( x ) × W ( y ) = 0.00076176 W(1)=W(x)\times W(y)=0.00076176 W(1)=W(x)×W(y)=0.00076176。同理,求得其余15个点对应的权重,再与各个点对应的数值相乘求和,所得结果即为估计点的数值大小。由于数据量大,此处便不再列出最终结果,且同理,此处需要用到边界的对称扩展。
  通过上述简单例子可以看出,双三次插值对于目标图像的每一个像素点的估计采用了其对应的16个像素点的加权组合,计算复杂度上升,但插值结果考虑了周围像素的变化率,使得放大效果的锐度得到了提高,如下图所示为利用双三次插值实现图像放大三倍的结果以及比较。


在这里插入图片描述在这里插入图片描述

二、Matlab实现

Matlab实现如下:

function R = bicubic(src, scale)
%% 双三次插值
src = double(src) / 255;
% 判断是灰度图还是RGB图像
if ismatrix(src)R = zeros(floor(size(src) * scale));
elseR = zeros([floor(size(src, 1, 2) * scale), 3]);
end
[dstM, dstN, ~] = size(R);
% 扩展原图像
misrc = zeros([size(src, 1, 2) + 2 * floor(scale), size(R, 3)]);
for i = 1 : size(R, 3)tmp = padarray(src(:, :, i), [floor(scale), floor(scale)], 'symmetric');misrc(:, :, i) = tmp;
end%逐像素点赋值
for dstX = 1 : dstMfor dstY = 1 : dstNsrcX = floor((dstX + 0.5) / scale - 0.5);srcY = floor((dstY + 0.5) / scale - 0.5);u = ((dstX + 0.5) / scale - 0.5) - srcX;v = ((dstY + 0.5) / scale - 0.5) - srcY;X1 = zeros(4, 4);  X2 = zeros(4, 4);  W1 = ones(4, 4); W2 = ones(4, 4);   % Bicubic基函数for i = 1 : 4for j = 1 : 4X1(i, j) = abs(u - i + 2);X2(i, j) = abs(v - j + 2);if X1(i, j) <= 1W1(i, j) = 1.5 * (X1(i, j)) ^ 3 - 2.5 * (X1(i, j)) ^ 2 + 1;elseif X1(i, j) < 2W1(i, j) = (-0.5) * (X1(i, j)) ^ 3 + 2.5 * (X1(i, j)) ^ 2 - 4 * X1(i, j) + 2;elseW1(i, j) = 0;endendif X2(i, j) <= 1W2(i, j) = 1.5 * (X2(i, j)) ^ 3 - 2.5 * (X2(i, j)) ^ 2 + 1;elseif  X2(i, j) < 2W2(i, j) = (-0.5) * (X2(i, j)) ^ 3 + 2.5 * (X2(i, j)) ^ 2 - 4 * X2(i, j) + 2;elseW2(i, j) = 0;endendendendW = W1 .* W2;Z = ones(4, 4);  %16个源像素点矩阵O = ones(4, 4);  %16个加权后的源像素点矩阵for dstC = 1 : size(R, 3)for i = 1 : 4for j = 1 : 4Z(i, j) = misrc(srcX - 2 + i + round(scale), srcY - 2 + j + round(scale), dstC);O(i, j) = W(i, j) .* Z(i,j);endendO1 = sum(sum(O));R(dstX, dstY, dstC) = O1;endend
end
end

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

相关文章

【opencv】最近邻插值、双线性插值、双三次插值(三次样条插值)

目录 1. 最近邻插值2. 双线性插值1&#xff09;简单理解2&#xff09;一般性 3. 双三次插值&#xff08;三次样条插值&#xff09;总结 b站 视频讲解 &#xff1a; https://www.bilibili.com/video/BV1wh411E7j9/ 1. 最近邻插值 举个简单例子&#xff1a;一个 3 3 3 \times 3…

挑战图像处理100问(27)——双三次插值

当我们需要对图像进行放大或缩小时&#xff0c;为了避免图像变形或失真&#xff0c;我们需要进行插值。插值是一种基于已知数据点&#xff0c;在这些数据点之间进行估计的方法。在图像处理中&#xff0c;常见的插值方法包括最邻近插值、双线性插值、双三次插值等。 双三次插值…

【图像超分辨(SR)】通俗直观彻底理解双线性插值、双三次插值及其作用

写在前面的一点话 网上讲解基本双线性插值、双三次线性插值的文章很多&#xff0c;但大部分都是只在讲为什么是这样&#xff0c;并不算非常通俗&#xff08;起码对我来说需要额外查很多资料来补充理解&#xff09;。很少有文章能够给初学者一些比较直观的理解&#xff0c;因此…

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

插值法(最邻近&#xff0c;双线性&#xff0c;双三次&#xff09;的原理及实现 常用的插值方法有最邻近插值法、双现象插值法和双三次插值法等&#xff0c;主要用于图像的放大或缩小。 缩小图像&#xff08;或称为下采样&#xff08;subsampled&#xff09; 或降采样&#xf…

表示关系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. 预处理组合数组合递推式 …