双三次插值及Matlab实现

一、简单实例

  采用简单实例进行对双三次插值的介绍,由于双三次插值对于目标图像的某一像素进行估计时,所采用的像素信息为其周围16个像素点信息,因此不同于最近邻插值和双线性插值,此时假设有5×55\times55×5大小的灰度图srcsrcsrc,如下所示:
[0.10.10.10.10.10.20.20.20.20.20.30.30.30.30.30.40.40.40.40.40.50.50.50.50.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.5​0.10.20.30.40.5​0.10.20.30.40.5​0.10.20.30.40.5​0.10.20.30.40.5​⎦⎥⎥⎥⎥⎤​目标图像dstdstdst期望大小为7×77\times77×7,则若要构建原始图像与目标图像之间的对应关系,根据之前的论述(最近邻插值及Matlab实现,后续有关扩展原始图像的内容也参看此篇),其映射公式为:
{srcX=(dstX+0.5)×(srcWidth/dstWidth)−0.5srcY=(dstY+0.5)×(srcHeight/dstHeight)−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​其中srcXsrcXsrcX、srcYsrcYsrcY分别为目标图像dstXdstXdstX、dstYdstYdstY处所对应的原图像坐标,那么,假设现需要求解目标图像坐标为(4,4)(4,4)(4,4)位置处,即为目标图像中心处的像素估计值,则有:
{srcX=(4+0.5)×(5/7)−0.5=2.714srcY=(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+1for |x| ⩽1a∣x∣3−5a∣x∣2+8a∣x∣−4afor 1<|x|<20otherwiseW(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)∣x∣3−(a+3)∣x∣2+1a∣x∣3−5a∣x∣2+8a∣x∣−4a0​for |x| ⩽1for 1<|x|<2otherwise​其中参数aaa为常系数,常取a=−0.5a=-0.5a=−0.5;变量xxx为红色点与16个对应像素之间的横向或纵向距离。双三次插值需要求解xxx、yyy两个方向上的权值,以左上方第一个像素点为例:①横向距离为x=1.724x=1.724x=1.724,则W(x)=(−0.5)∣1.724∣3−5(−0.5)∣1.724∣2+8(−0.5)∣1.724∣−4(−0.5)=−0.0276W(x)=(-0.5)|1.724|^3-5(-0.5)|1.724|^2+8(-0.5)|1.724|-4(-0.5)=-0.0276W(x)=(−0.5)∣1.724∣3−5(−0.5)∣1.724∣2+8(−0.5)∣1.724∣−4(−0.5)=−0.0276;②纵向距离为y=1.724y=1.724y=1.724,则W(y)=−0.0276W(y)=-0.0276W(y)=−0.0276;③第一个像素点对估计点造成的影响,即其权重则为W(1)=W(x)×W(y)=0.00076176W(1)=W(x)\times W(y)=0.00076176W(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

双三次插值及Matlab实现相关推荐

  1. 图片缩放 算法 matlab,图像放大算法总结及MATLAB源程序.doc

    图像放大算法总结及MATLAB源程序 1,插值算法(3种): (1)最邻近插值(近邻取样法): 最近插值的的思想很简单就是把这个非整数坐标作一个四舍五入,取最近的整数点坐标处的点的颜色.可见,最邻近插 ...

  2. 【图像处理】双三次插值(Bicubic interpolation)原理及matlab简易版代码

    先简单写下. 双线性插值:缩放后图像矩阵(简称TI)像素坐标映射到原图像矩阵(简称OI)中得坐标点P(x,y),P点临近四个坐标点像素值的线性加权求和即P点像素值. "双"指的图像 ...

  3. matlab双立方插值法_双三次插值(Bicubic interpolation)缩放图片

    References:https://en.wikipedia.org/wiki/Bicubic_interpolation Bicubic interpolation是一种常用的插值方法 1.数学 ...

  4. MATLAB【十三】————仿真函数记录以及matlab变成小结

    part one:matlab 编程小结. 1.char 与string的区别,char使用的单引号 '' ,string使用的是双引号"". 2.一般标题中的输出一定要通过 nu ...

  5. MATLAB【七】———— matlab 高斯核使用,超像素图像模拟,矩阵转图像,深度相机模型实践实现

    深度模型,图片转稀疏矩阵,稀疏矩阵转图片 %% mat to 2array temp_speckle = ref_speckle; [row_index,col_index,v]=find(temp_ ...

  6. 图像处理(一)——使用matlab放缩图像

    图像放缩:使用双线性插值法和双三次插值法 Introduction In this experiment, matalb is used to zooming and shrinking an ima ...

  7. 基于matlab的脑瘤mr图像处理_基于Matlab GUI的医学图像处理课程虚拟实验平台设计...

    论文写作指导:请加QQ229366758 摘 要:针对医学生工程技术缺乏的状况,分析医学生学习医学图像处理存在的困难,提出利用Matlab图像处理工具和简单的GUI界面,设计和构建包含医学图像处理教学 ...

  8. MATLAB插值问题

    一.一元函数插值 已知函数y=f(x)在区间[a,b]上的n+1个不同点的函数值为,若存在一个简单函数F(x), 使,称F(x)为f(x)在区间[a,b]上的插值函数,称(xi, yi)为插值节点.若 ...

  9. Matlab矩阵填充--Matlab interp2

    Matlab interp2 为Matlab的矩阵填充函数, 填充关系: x=1:11; y=1:13; x1=1:0.1:12; y1=1:0.1:14; [x2,y2]=meshgrid(x1,y ...

  10. matlab imresize对图像进行缩小放大

    matlab中函数imresize简介: 函数功能:该函数用于对图像做缩放处理. 调用格式: B = imresize(A, m) 返回的图像B的长宽是图像A的长宽的m倍,即缩放图像. m大于1, 则 ...

最新文章

  1. TensorFlow+TVM优化NMT神经机器翻译
  2. 从易于扩展扩展的角度来设计FizzBuzzWhizz
  3. python 3.9 新特性 简介
  4. c# excel导出png_c#根据html模板导出excel
  5. Generic Access Profile (GAP)
  6. radio切换控制div显示_JavaScript连载31图片动态切换以及关闭图片案例
  7. nutshell_Nutshell中的Java 8语言功能-第2部分
  8. buy low buy lower——伪思考
  9. SQL中的CONSTRAINT用法总结
  10. C++ 出现异常“.... \debug_heap.cpp Line:980 Expression:__acrt_first_block==header“
  11. 部分公务员已领数字货币工资,数字货币或年内扩大试点,支付宝、微信支付还会有优势吗?
  12. hash function/ hash table 背后的数学基础
  13. 关于依赖倒置,控制反转和依赖注入的趣谈
  14. 《统计学》第八版贾俊平第十一章一元线性回归知识点总结及课后习题答案
  15. hau 1825 第一道拓扑排序题
  16. 如何在scrapy框架里进行调试嘞
  17. linux java模拟器_在Android模拟器和Ubuntu上测试Linux驱动
  18. 电脑回收站在哪里?回收站删除的文件怎么恢复?
  19. 传统企业互联网转型升级新玩法:技术合伙
  20. 请编写函数实现自然底数 e=2.718281828

热门文章

  1. 左程云 Java 笔记--暴力递归--动态规划
  2. C++/Qt获取屏幕尺寸和放大比例
  3. DTCloud 报表开发
  4. Vue实例对象中的属性与方法---kalrry
  5. GMSK信号调制公式与matlab代码
  6. 哈工大2022形式语言与自动机期末
  7. 软件项目开发计划编制过程
  8. dnf全部使用_DNF的命令使用教学
  9. Origin抗锯齿和出现大C
  10. 容器监控实践—CAdvisor