文章目录

  • 1 插值是什么?为啥要插值?
  • 2 Matlab实现最近邻插值、双线性插值、双三次插值
  • 3 最近邻插值的原理简介
  • 4 双线性插值的原理简介
  • 5 双三次插值原理简介

参考博客1:(双线性讲得好) https://blog.csdn.net/xjz18298268521/article/details/51220576
参考博客2:(双三次讲得好) https://blog.csdn.net/caomin1hao/article/details/81092134
参考博客3:(matlab的实现,靠不同参数) https://blog.csdn.net/wanzi1122/article/details/79858854
参考博客4:(最近邻讲得好,而且有各个插值法的特点总结) https://blog.csdn.net/nandina179/article/details/85330552
参考博客5:(双三次的坐标图很好) https://blog.csdn.net/yycocl/article/details/102588362
感谢所有的博主!
这周看文献,发现人家的预处理部分写得好好,单单图片缩放讲的好清楚啊,为啥缩放,使用什么数学原理进行缩放,具体缩放到多大都写的好清楚,在论文中看到了双三次插值,即bicubic interpolation,当时不知道是啥,查了下资料,整理一下。

1 插值是什么?为啥要插值?

一句话来说就是在图片缩放中,可能出现目标图片中的坐标对应的原图片的坐标是小数,小数坐标可以表示但是灰度值却没法一一对应,所以需要通过插值来利用某些整数坐标的灰度值把小数坐标的灰度值计算出来。
我当时一直不明白什么叫插值,直到看到了参考博客1的解释:
假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a记为k1和n/b记为k2。注意,通常这个比例k1和k2不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应的原图像的坐标为(im/a,jn/b),im/a记为k3,jn/b记为k4。显然,这个对应坐标(k3,k4)一般来说不是整数,但是图片其实就是灰度值组成的矩阵,而非整数的坐标(k3,k4)是无法在图像这种离散数据上使用的。也就是说,假设第1行第1列的点灰度值是125,我们就可以知道这个点差不多是灰色的,但是我们不可能说第1.25行,第0.38列的点的灰度值是啥。因为虽然我们算出来的坐标是小数,这个坐标可以用小数表示,但是图片中对应坐标的像素指我们不能表示,因为图片是中没有1.25行,0.38列,所以没法表示。
但是图片因为缩放,小数坐标肯定无法避免,那么具体怎么操作呢?答案就是 插值
,根据博客2所说,我们可以通过插值把算出来的小数坐标变成整数坐标,然后把算出来的整数坐标处的灰度值填入目标矩阵中。或者是用整数坐标的灰度值经过某种方法”计算“出小数坐标的灰度值,当我们采取不同的方式时,就是不同的插值法了,常见的插值法有最近邻插值、双线性插值、双三次插值,下面会对这几种进行介绍。

2 Matlab实现最近邻插值、双线性插值、双三次插值

matlab 有现成的,此处参考博客3
B = imresize(A,m,method) 将图片A由参数method指定的插值运算方法来改变图像的大小到m倍,
method的几种可选值:

’nearest’最近邻插值(默认)
'bilinear’双线性插值
'bicubic’双三次插值

3 最近邻插值的原理简介

最近邻算法是最简单的插值算法,原理就是四舍五入,具体可以参考博客4
这里我把图片拿来用,图片来源博客4

同样来自博客4:如果 i+u, j+v(i落在 A区,即 u<0.5,v<0.5,则将左上角象素的灰度值赋给待求象素,同理落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。
博客4说 最近邻插值法计算量较小,但可能会造成生的图像灰度上的不连续,在变化地方可能出现明显锯齿状。

4 双线性插值的原理简介

双线性插值主要参考博客1,博客1中写道
若图像为灰度图像,那么(i,j)点的灰度值的数学计算模型是:f(x,y)=b1+b2x+b3y+b4xy
其中b1,b2,b3,b4是相关的系数。关于其的计算过程如下如下:
如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。


首先在 x 方向进行线性插值,得到

然后在 y 方向进行线性插值,得到

这样就得到所要的结果 f( x, y),

如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

ps
1 我一直不懂啥叫f(Q11),其实就是 Q11这个点的灰度值
2 为啥是x2-x 乘以Q12?不是Q22呢?因为x2-x说明是R2这个点到 Q22的距离,这个值越大说明离得越远,那么这个点就受Q22的影响越小,总的2个点,那换句话来说就是受Q12的影响越大,所以乘以 Q12
3 我们已知的是5个点的坐标值(4个Q点+目标的P点),已知的还有4个Q点处的灰度值**,要求的量是P点处的灰度值**。其他插值法其实也差不多,只是已知的坐标不一样,还有计算的方式不一样而已。

博客4说 双线性内插法的计算比最邻近点法复杂,计算量较大但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

5 双三次插值原理简介

此处参考博客5
1坐标的位置关系,原图片来自博客5,只是我觉得好像应该这么修改一下

注意:P(1,0)应该写为P(0,0),而且这张图应该把点的矩阵转置一下
2.插值函数
插值函数是对于理论上最优插值函数s i n ( x ) / x sin(x)/xsin(x)/x的近似。
函数如下,一般取a = -0.5

3.像素值计算
对于每个像素点像素值的计算:

双三次就是两个3次方,三次方指的是上面的W是三次多项式,双指的就是x和y两个方向,所以我们可以看到是两个W相乘。

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

matlab-imresize-最近邻插值、双线性插值、双三次插值学习总结相关推荐

  1. 最近邻插值、双线性插值、双三次插值

    1.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表 ...

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

    目录 1. 最近邻插值 2. 双线性插值 1)简单理解 2)一般性 3. 双三次插值(三次样条插值) 总结 1. 最近邻插值 举个简单例子:一个3×33 \times 33×3 的单通道图像,如下 如 ...

  3. 图像插值算法:最近邻插值、双线性插值

    插值算法:最近邻插值.双线性插值 文章目录 插值算法:最近邻插值.双线性插值 最近邻插值法(nearest_neighbor) 线性插值 单线性插值法 双线性插值 插值算法有很多种,这里列出关联比较密 ...

  4. 数字图像缩放之最近邻插值与双线性插值处理效果对比

    基本原理: 1.最近邻插值:变换后的目标图像某点像素值等于源图像中与变换前相应点最近的点的像素值.具体操作为,设水平方向和垂直方向缩放的比例分别为w和h,那么目标图像中的点des(x,y)对应的源图像 ...

  5. 最近邻插值与双线性插值

    最近邻插值 顾名思义,最近邻插值法在放大图像时补充的像素是最近邻的像素的值.由于方法简单,所以处理速度很快,但是得到的图像常常含有锯齿边缘.如下图所示: import cv2 import numpy ...

  6. js插值计算_js图像处理 双线性插值 双三次插值法 实现

    介绍 在网页中利用canvas进行绘图时,遇到一个问题,原始的数据分辨率很小,而图片要放大到整个网页,所以需要把数据进行插值放大.学习了双线性插值和三次内插法插值,两种方式实现效果不同,双线性插值放大 ...

  7. CV笔记2:图像插值算法—最近邻插值、双线性插值

    目录 一. 简介 二.最近邻插值 三.双线性插值 3.1 线性插值 3.2 双线性插值 3.3 双线性插值的加速及优化策略 参考 一. 简介 在图像处理中,平移变换.旋转变换以及放缩变换是一些基础且常 ...

  8. 【机器视觉学习笔记】最近邻插值实现图片任意角度旋转(C++)

    目录 原理 源码 RotateImage 主函数 效果 完整源码 速度优化 源码 优化效果 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文算 ...

  9. MATLAB imresize函数的用法

    基本上都是copy别人的,用来方便自己查阅学习. matlab中imresize()函数的功能是改变图像的大小. 其用法有多种:* 1.B = imresize(A,m) 将图片A放大m倍 2.B = ...

  10. matlab imresize

    功能:改变图像的大小. 用法:B = imresize(A,m) B = imresize(A,m,method) B = imresize(A,[mrows ncols],method) B = i ...

最新文章

  1. 权威解答495个最常遇到的C语言问题
  2. 10款无需编程的App DIY开发工具
  3. 中美专利对比:2015年中国上升 美国首降
  4. 广度优先搜索_广度优先搜索(BFS)
  5. C# 11 中的参数 null 检查
  6. 猴子选大王 (20 分)
  7. Linux源码安装pgadmin4,Linux 服务器部署 PgAdmin 4 Server
  8. 历史上的今天:首条海底光缆开通;VeriSign 收购 Network Solutions;计算机图形学先驱诞生...
  9. hive外部表/内部表路径知识点
  10. MSSQL生成连续的时间
  11. html网页音乐手机播放,网页添加背景音乐代码,支持手机端的html5代码播放器
  12. 批量重命名图片去掉烦人的括号
  13. 开发者体验:如何更好的呈现错误?
  14. 记录今天用ETL工具KETTLE遇到打不开job问题
  15. 华为云ecs服务器镜像上传到容器镜像服务SWR
  16. HDMI转换芯片——MS9288C
  17. Java爬虫实践:Jsoup+HttpUnit爬取今日头条、网易、搜狐、凤凰新闻
  18. [网络收集]JS刷新页面总和!多种JS刷新页面代码!
  19. VUE 前端PDF分页预览、下载
  20. c#量化交易_量化交易从入门到放弃(1)

热门文章

  1. 用nmap查看局域网存活的主机
  2. B端产品经理知识框架
  3. 心理学与生活 - 发展与教育
  4. 永磁同步电机转速电流双闭环PI+MTPA+弱磁控制Simulink仿真模型
  5. 一步一步教你实现Emoji表情键盘
  6. TB6612驱动和MG513P3012V电机
  7. 17-什么是资源服务器
  8. SuiteCRM搭建报错:ERROR:: Database Support was not found
  9. QT之QTreeView使用总结
  10. Linux-常用命令