双三次插值及Matlab实现

2023-11-13

双三次插值及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));
else
    R = 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 : dstM
    for dstY = 1 : dstN
        srcX = 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 : 4
            for j = 1 : 4
                X1(i, j) = abs(u - i + 2);
                X2(i, j) = abs(v - j + 2);
                if X1(i, j) <= 1
                    W1(i, j) = 1.5 * (X1(i, j)) ^ 3 - 2.5 * (X1(i, j)) ^ 2 + 1;
                else
                    if X1(i, j) < 2
                        W1(i, j) = (-0.5) * (X1(i, j)) ^ 3 + 2.5 * (X1(i, j)) ^ 2 - 4 * X1(i, j) + 2;
                    else
                        W1(i, j) = 0;
                    end
                end
                if X2(i, j) <= 1
                    W2(i, j) = 1.5 * (X2(i, j)) ^ 3 - 2.5 * (X2(i, j)) ^ 2 + 1;
                else
                    if  X2(i, j) < 2
                        W2(i, j) = (-0.5) * (X2(i, j)) ^ 3 + 2.5 * (X2(i, j)) ^ 2 - 4 * X2(i, j) + 2;
                    else
                        W2(i, j) = 0;
                    end
                end
            end
        end
        W = W1 .* W2;
        Z = ones(4, 4);  %16个源像素点矩阵
        O = ones(4, 4);  %16个加权后的源像素点矩阵
        for dstC = 1 : size(R, 3)
            for i = 1 : 4
                for j = 1 : 4
                    Z(i, j) = misrc(srcX - 2 + i + round(scale), srcY - 2 + j + round(scale), dstC);
                    O(i, j) = W(i, j) .* Z(i,j);
                end
            end
            O1 = sum(sum(O));
            R(dstX, dstY, dstC) = O1;
        end
    end
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双三次插值及Matlab实现 的相关文章

  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 为什么 MATLAB 本机函数 cov(协方差矩阵计算)使用与我预期不同的除数?

    给定一个 M 维和 N 个样本的数据矩阵数据 例如 data randn N M 我可以计算协方差矩阵 data mu data ones N 1 mean data cov matrix data mu data mu N 如果我使用原生
  • 为什么 MATLAB 在打印大量 (.png) 图形时速度会变慢?

    我正在将大量数字打印为 png 文件 每个图都是数据矩阵中的一列图 我获取 png 文件并将它们串在一起形成动画 我的问题是 前几百张图像打印得很快 但创建每个新图形的时间却迅速增加 从前几百个 png 文件的约 0 2 秒到第 800 个
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 我如何编写一个名为 dedbi 的 MATLAB 函数,它将输入 xtx 作为字符串并返回另一个字符串 xtxx 作为输出。

    dedbi 反转单词 即 a 将被 z 替换 b 将被 y 替换 c 将被 x 替换 依此类推 dedbi 将对大写字母执行相同的操作 即将字符串 A 替换为 Z 将 B 替换为 Y 将 C 替换为 X 依此类推 如果我给函数这个字符串 a
  • 如何在Matlab中打印带有千位分隔符的整数?

    我想使用逗号作为千位分隔符将数字转换为字符串 就像是 x 120501231 21 str sprintf 0 0f x 但随着效果 str 120 501 231 21 如果内置fprintf sprintf做不到 我想可以使用正则表达式
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看

随机推荐

  • Bootstrap Metronic 学习记录(一)简介

    1 简介 是一个基于Bootstrap 3 x的高级管理控制面板主题 Bootstrap Metronic 是一个完全响应式管理模板 基于Bootstrap3框架 高度可定制的 易于使用 适合从小型移动设备到大型台式机很多的屏幕分辨率 包含
  • Kafka : kafka重启报错 ZkClient allready closed

    1 美图 2 背景 kafka突然发现 有问题了 然后重启 却发现报错 但是zk是好的
  • 量化:年化收益、期初收益、期末收益、年份,任意3个值计算剩下的1个值

    1 网页计算器可以参考 新浪财经投资收益计算器 http finance sina com cn money 283 2005 0708 19 html 计算方法 由图可知 F V 1 r
  • String字符串转换成JsonArray的两种方法,以及JSONArray解析为List的方法

    1 首先引入相关的jar包 gson JSONObject JSONArray 点我下载 2 编写代码 public class Test public static void main String args String转换成JSONA
  • 20220129CTF刷题-- WEB方向

    20220129CTF刷题 WEB方向 新手级别 刷题网站 攻防世界 这题其实就是爆破 没什么特别的 随便尝试被告知要以admin登陆 admin登陆之后 随便输一个密码 又弹出密码错误 但是查看页面源代码 又被告知 你可能需要一个字典 那
  • C# 一般处理程序

    C 一般处理程序 using System Web using System Data using System Text using System Data SqlClient public class GetWaterUser IHtt
  • Multiple representations of the same entity are being merged解决方法

    最近在写网站过程中发现自己hibernate学的还不到家 好多错误 特地来记录一下这个错误 java lang IllegalStateException Multiple representations of the same entit
  • GIt Error解决办法-不完整

    Pull 遇到的错误 Git fatal The remote end hung up unexpectedly Error RPC failed curl 18 transfer closed with outstanding read
  • Unity3D 车流线

    效果图 因为是静态图片可能不太能看出效果 车流线主要是用来模拟城市中行动的车 直接使用车模型 会在大场景中看不清楚 效果不会很好 一 实现原理 车流线肯定是需要绘制线条的 我这里直接使用TrailRender 这个拖尾功能可能很好帮助我们控
  • NPM酷库:accounting,格式化数字和货币

    NPM酷库 每天两分钟 了解一个流行NPM库 上次 我们了解到如何使用numeral库格式化数字 今天我们继续认识另外一个用来格式化数字的库accounting accounting accounting 主要提供的方法有 formatMo
  • Shuffle过程详解

    Shuffle过程详解 Shuffle过程是MapReduce的核心 最近看了很多资料 网上说法大体相同 但有些地方有一点点出入 就是各个阶段的执行顺序 总个shuffle过程可以看做是从map输出到reduce输入的这个中间过程 在这个中
  • Java 学习路线

    文章目录 Java基础 1 Java 基本功 1 1 Java 入门 基础概念与常识 1 2 Java 语法 1 3 基本数据类型 1 4 方法 函数 2 Java 面向对象 2 1 类和对象 2 2 面向对象三大特征 2 3 修饰符 2
  • web前端面试的自我介绍

    开始背景 1 面试官在你自我介绍的时候 才有时间看你的简历 人太多没时间看 看了也记不住 2 你在自我介绍中 他在想问你什么问题 3 了解你语言 表达能力 自信气场 仪表形态 常规低级错误 1 对面试官说 简历上有你自己看吧 2 对照简历就
  • .sh文件中第一行 #!/bin/bash -il 是什么

    sh文件中第一行 bin bash il 是什么 是执行该脚本文件的解释器的路径和选项 在一个 shell 脚本文件的第一行加上 符号 称为 shebang 它告诉系统使用哪个解释器执行这个脚本 在 bin bash 的例子中 它告诉系统使
  • Deep learning-based CSI Feedback for Beamforming 1

    1 Abstract The potentials of massive multiple input multipleoutput MIMO are all based on the available instantaneous cha
  • 目标检测综述-------深度学习用于目标检测的近期进展 introduction(一)

    论文题目 Recent Advances in Deep Learning for Object Detection 论文地址 摘要 目标检测是计算机视觉一个重要的视觉问题并且在最近得到了广泛的研究 视觉目标检测致力于在给定的图像内找到带有
  • “No input file specified “问题的处理

    接手新项目 配置的时候 遇上了 No input file specified 的问题 第一反应 是上网搜 关于这个问题的帖子有很多 总的来说 得到的问题原因有 一 跟路径有关系 路径没指对 二 可能是权限的问题 如 不允许访问 三 SCR
  • 《实现VM机与本机互ping》

    实现VM机与本机互ping 1 安装VM机及对应的OS gt 到本机检测VMware Network Adapter VMnet8是否已经生成 网上邻居 网络连接 2 查看 VMware Network Adapter VMnet8 网络I
  • C++ for循环跳过某一项求和

    include
  • 双三次插值及Matlab实现

    双三次插值及Matlab实现 一 简单实例 采用简单实例进行对双三次插值的介绍 由于双三次插值对于目标图像的某一像素进行估计时 所采用的像素信息为其周围16个像素点信息 因此不同于最近邻插值和双线性插值 此时假设有 5 5 5 times5