基于python实现最近邻插值双线性插值径向基函数插值(代码实现详细教程)

这篇具有很好参考价值的文章主要介绍了基于python实现最近邻插值双线性插值径向基函数插值(代码实现详细教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

三种插值方法都是使用Python自己实现的。

1.1 最近邻插值

寻找每个中心点周围的八个点中有无未丢失的点,如果有的话就赋值为第一个找到的点,如果没有就扩大范围再次寻找,在最大范围内都找不到的话就跳过。

1.2 双线性插值

使用解方程的方法求解,整体思路类似colorization作业的实现,每个点用周围的八个点线性表示,根据距离为1和确定两个权重。四个边界上的点只会由五个邻居来表示,每个权重为0.2,线性平均求和。构建稀疏矩阵,求解,A为权重的稀疏矩阵,x为一个通道上的像素点值,b为原图中保留的像素点的值。

1.3 径向基函数插值

确定一个邻域,根据邻域内的已知点,求解出rbf函数的参数w,然后使用w和这个径向基函数对邻域内的未知点进行拟合。算法有两个超参数——邻域大小、邻域移动的步长。邻域越大、步长越小计算结果越好,但是花费时间也越长。总共实现了以下六个rbf基函数。

三种算法都实现读取RGB通道的图像,将RGB转换成YUV进行运算,最后将结果转换为RGB图像进行展示、保存和评估。之所以进行转换是因为使用YUV可以保证所有的运算都是以float类型进行的,只在开始和结束进行两次转换,可以保证计算的正确性。一开始直接使用RGB通道进行计算,结果会出现异常,如下所示(90%的丢失率), 可能是由于中间int和float的类型转换导致的,因为统一使用YUV格式计算后问题就被规避了:

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

另外RBF插值中如果步长过大,会导致结果分块现象明显,下面是一个极端的情况,分块之间有一个像素点未被计算:

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

二、随机丢点的评估


使用RBF进行插值计算非常慢,所以选择了一幅较小的图片进行连续的评估,原图如下:

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

2.1 肉眼观察


以下分别是丢失率从0.1到0.9的修复结果,从左向右依次是bilinear、nearest、RBF(使用multiquadric 基函数):

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

从上图的变化中可以看出在丢失率比较小的时候,三种算法并没有什么肉眼可见的差异,几乎都和原图相同。但是随着丢失率的上升,三种算法差异比较明显:

最近邻算法(中间)的结果变的模糊,并且有些走样,出现了原图中没有的结构双线性插值(左边)也有些模糊,但是看起来像是做过滤波平滑一样,但人脸结构都是正常的

RBF插值(右边)的结果看起来比双线性的结果要清晰一些,也没有出现太多走样,但是有一些分块的边界比较明显,应该是因为设置的步长过大。下面在丢失率为90%时使用三种算法进行还原:
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

都能对图像做出不错的还原效果,但是最近邻插值会产生原本图像中没有的结构。

2.2 指标变化曲线


种算法比较 在上面的测试中,三种评价指标随丢失率增长的变化曲线如下所示:

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

三种指标都可以看出RBF的结果最好,并且随着丢失率的增大,MSE增大、PSNR减小、SSIM减小的趋势也都是合理的。尤其是SSIM衡量结构相似性,在丢失率很小的时候三种算法都接近于1,这和上面肉眼观察的结果也是相同的。

RBF三种基函数比较

仍然是使用上面测试的那张图片,三种基函数中multiquadric和TPS的结果几乎是一模一样的,三个指标的曲线都是重合的,inverse quadric函数的结果要比另外两个差很多。

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

下面展示了丢失率在60%~90%时三种基函数对应的结果,很明显的可以看出inverse quadratic的效果非常差,还不如上面的最近邻插值,而另外两种基函数的结果没有太大差异,跟上面三种评价曲线的结果是一致的。

除了inverse quadratic函数之外,gaussian函数的效果也不好,这是因为修复的结果和径向基函数的系数是有关系的,而基函数中都默认为1,没有具体变化,所以导致有的基函数效果很差。

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

三、涂鸦、写字等破坏的评估


3.1 结果展示


对三幅图片分别进行了涂鸦、写字等破坏,修复结果如下:

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

显然最近邻算法的效果最差,都没能把涂鸦全都填起来,这应该是因为寻找的范围还不够大,有一些点正好处在全部都是空白的区域。另外两种的效果差不多,双线性修补结果更模糊一些,看起来效果甚至更好。

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

显然可以看出写字的修复效果要比画线的效果好得多,虽然一行字看着和涂鸦的宽度差不多,但是字母或者汉字并不是完全把小区域内的像素毁掉,而是留有一些缝隙,这些保留的缝隙正好可以起到很好的修复效果,所以就算是最近邻算法都有了比较好的表现。

python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

可以看出仍然是最近邻算法的修复效果最差,尤其是对于画线的涂鸦部分,并且“董威龙”文字的部分修复效果也不好,因这个三个字笔画比较多,涂鸦效果基本和画线一样。bilinear和RBF效果差不多,涂鸦的部分虽然修复了,但是看着有一点模糊。

3.2 指标得分


以下是MSE、PSNR、SSIM三种损失评价的结果(MSE和SSIM使用Python提供的库,PSNR使用MSE结果自己计算):

MSE

图一

图二

图三

RBF

15.85

10.72

9.10

bilinear

14.42

10.96

9.29

nearest

15.68

10.79

9.07

PSNR

图一

图二

图三

RBF

36.13

37.82

38.54

bilinear

36.54

37.73

38.44

nearest

36.17

37.80

38.31

SSIM

图一

图二

图三

RBF

0.934

0.981

0.980

bilinear

0.948

0.975

0.978

nearest

0.881

0.970

0.961

3.3 极限测试


python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档
python 双线性插值,python实战100例,python,开发语言,opencv,计算机视觉,Powered by 金山文档

双线性插值在涂鸦部分是有所变化的,像是加上了一层半透明的蒙版效果,具有了图像本身的色调,这是因为双线性插值的算法是解一次方程得到整张图中一个通道的所有像素点信息,具有一定的全局性。

最近邻插值和RBF插值只是在一个局部邻域内进行计算,由于图片整个上半部分都被去除,邻域内没有任何已知点,所以得不到计算的结果,RBF略强于最近邻插值,在边界处图像有了一定的变化。

3.4 总结


查了一些近年来的图像修复算法,几乎全都是深度学习相关算法,并且大部分是基于CVPR 2016的Context-Encoders方法,使用了CNN+GAN,由于时间不够没有拿这些新的方法与作业中的方法对比。综合以上比较来看,双线性差值的效果应该是最好的,因为双线性插值的速度远快于RBF插值,这可能也跟RBF插值的实现不够“优雅”有关。并且对于相同算法,使用MATLAB的同学计算速度要比Python快一些,而且MATLAB的结果中MSE损失的数值平均比Python小一些,可能MATLAB对于数值计算有更好的优化。

完整代码:

https://download.csdn.net/download/qq_38735017/87380756?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167359597116800182192106%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fdownload.%2522%257D&request_id=167359597116800182192106&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2~download~first_rank_ecpm_v1~rank_v31_ecpm-1-87380756-null-null.pc_v2_rank_dl_default&utm_term=%E5%9F%BA%E4%BA%8EPython%E5%AE%9E%E7%8E%B0%E7%A7%8D%E5%B7%AE%E5%80%BC%E6%96%B9%E6%B3%95%20%282%29&spm=1018.2226.3001.4451.1文章来源地址https://www.toymoban.com/news/detail-725180.html

到了这里,关于基于python实现最近邻插值双线性插值径向基函数插值(代码实现详细教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图片双线性插值原理解析与代码 Python

    图片插值是图片操作中最常用的操作之一。为了详细解析其原理,本文以 3×3 图片插值到 5×5 图片为例进行解析。如上图左边蓝色方框是 5×5 的目标图片,右边红色方框是 3×3 的源图片。上图中,蓝/红色方框是图片,图片中的蓝/红色小圆点是图片中的像素,蓝/红色实线箭头

    2024年02月02日
    浏览(49)
  • 双线性插值简介及C++代码实现

    双线性插值是指现在某个方向进行两次线性插值,之后在另外一个方向对插值的结果再进行一次线性插值。以下图为例,已知 Q 11 Q_{11} Q 11 ​ , Q 12 Q_{12} Q 12 ​ , Q 21 Q_{21} Q 21 ​ , Q 22 Q_{22} Q 22 ​ 四个点的坐标和像素值、 P P P 点的坐标,求 P P P 点的像素值。双线性插值的

    2024年02月07日
    浏览(41)
  • 在 FPGA 上如何实现双线性插值的计算?

    作者 | 殷庆瑜  责编 | 胡巍巍 目录 一、概述 二、What?什么是双线性插值? 二、Why?为什么需要双线性插值? 三、How?怎么实现双线性插值? 关键点1 像素点选择 关键点2 权重计算 升级1 通过查表减少计算量 升级2 通过数据锁存减少取数周期 升级3 通过换数信号兼容更多分

    2024年02月08日
    浏览(39)
  • 使用径向基函数(RBF)神经网络对我们自己的excel数据进行分类---包括详细的python代码,RBFRegressor

    径向基神经网络(Radial Basis Function Neural Network)是一种人工神经网络,它由三层组成:输入层、隐藏层和输出层。与传统的神经网络不同,径向基神经网络并不使用传统的激活函数,而是使用径向基函数作为激活函数,即: y = f ( z ) y = f(z) y = f ( z ) ,其中 f f f 是径向基函数

    2024年02月10日
    浏览(42)
  • 双线性插值(Bilinear interpolation)原理推导

    https://en.wikipedia.org/wiki/Bilinear_interpolation 双线性插值,又称为双线性内插。在数学上,双线性插值是对线性插值在二维直角网格上的扩展,用于对双变量函数(例如 x 和 y)进行插值。其核心思想是在x,y两个方向分别进行一次线性插值。 线性插值可以查看 之前的博客文章。

    2024年02月16日
    浏览(39)
  • 【语音识别】基于主成分分析PCA结合最近邻KNN实现声音自动分类附matlab代码

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信       无

    2024年04月27日
    浏览(68)
  • 数字图像处理(十三)图像放大及双线性插值算法

    图像放大是日常学习中经常要用到的两个算法,我们首先讨论缩放的流程以及放大时如何优化双线性插值算法。 采用国际标准测试图像Lena,为了方便,我们将读入的彩色图转为灰度图进行缩放。 和图像缩小不同,图像放大是小数据量到大数据量的处理过程,因此需要对许多

    2024年02月05日
    浏览(48)
  • Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积) (新增对比试验组)

    🌟想了解YOLO系列算法更多教程欢迎订阅我的专栏🌟 对于基础薄弱的同学来说,推荐阅读《目标检测蓝皮书》📘,里面涵盖了丰富的目标检测实用知识,是你迅速掌握目标检测的理想选择! 如果想了解 YOLOv5 和 YOLOv7 系列算法的训练和改进,可以关注专栏《YOLOv5/v7 改进实战

    2024年02月07日
    浏览(50)
  • 九.图像处理与光学之图像几何变换算法(双线性插值)

    ​ 图像几何变换是图像处理中非常基础实用的技能,主要包括图片位移、缩放、镜像、剪切、放射变换等,在对图像进行空间变换的过程中,典型的情况是在对图像进行放大,旋转处理的时候,图像会出现失真的现象。这是由于在变换之后的图像中,存在着一些变换之前的图

    2024年02月13日
    浏览(46)
  • 《数字图像处理》实验之对图像进行双线性(bilinear)插值缩放

     最近数字图像处理的实验课,老师让我们实现 对图像进行双线性(bilinear)插值缩放 ,以下是原理和代码。 一、双线性插值缩放 1、图像几何变换的一般流程: ①确定变换后新图像的大小 ②对新图像的每一个像素,确定其在旧图像坐标中的对应位置(逆变换) ③确定旧图像

    2024年02月07日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包