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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 基于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格式计算后问题就被规避了:


9599b6994f6d190b55016ab41e634110.jpg


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




c914bcf3d121558901ddf546a3017343.jpg


二、随机丢点的评估

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


9889074899418c4d6fdde30f51733cc2.jpg


2.1 肉眼观察

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

09bf3ead46f55e31555294f8e2372b50.jpg

4fad66a20d67fb9973856783347b29eb.jpg


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


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

RBF插值(右边)的结果看起来比双线性的结果要清晰一些,也没有出现太多走样,但是有一些分块的边界比较明显,应该是因为设置的步长过大。下面在丢失率为90%时使用三种算法进行还原:

c00c67a5b96e280d416b2c9f77c1215c.jpg562d96fc7a6bcfc55a86daca338bdafa.jpg


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

2.2 指标变化曲线

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


0daed8a720cfef3f0d9b651d64dd59c6.jpg

da8a7ace84e1a2b0e0624a8750578cbf.jpg


af508913f79a4fcdb7dcf7980f6c7638.jpg

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


RBF三种基函数比较


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


fc9d2ad8b7ff39c5a6fabe089759f0ca.jpgfd7c0b438eaed12de583eb298cdd313c.jpg


dab99e3df8ab452d8d59d9f957841a56.jpg


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


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

0c128668992891d65e0944d3a37e55e7.jpg


133541167ad80200d0acffe5fc1c9cd8.jpg



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

3.1 结果展示

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


2cbe3288086163041fa2d7c3e12fdc7a.jpg

5c0ed9ce828f775c4a41702a52a69c14.jpg


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


010892ae40f8cd918fc226759f075cff.jpg

b7852265684a8fee92ecaa760d97b442.jpg

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


0b123758cef70de5cf7f9b154f8c5d52.jpg



81b0eaf6ed9f355328b4d1e352decb7d.jpg

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

3.2 指标得分

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

MSE


image.png


image.png


SSIM


image.png


3.3 极限测试

591f3c9c60c133e92e21ae7197af3670.jpg

b156d75ecd150f7689835e755cb7de54.jpg

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


最近邻插值和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

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
9天前
|
BI Python
SciPy 教程 之 Scipy 显著性检验 8
本教程介绍SciPy中显著性检验的应用,包括如何利用scipy.stats模块进行显著性检验,以判断样本与总体假设间的差异是否显著。通过示例代码展示了如何使用describe()函数获取数组的统计描述信息,如观测次数、最小最大值、均值、方差等。
19 1
|
12天前
|
缓存 监控 测试技术
Python中的装饰器:功能扩展与代码复用的利器###
本文深入探讨了Python中装饰器的概念、实现机制及其在实际开发中的应用价值。通过生动的实例和详尽的解释,文章展示了装饰器如何增强函数功能、提升代码可读性和维护性,并鼓励读者在项目中灵活运用这一强大的语言特性。 ###
|
10天前
|
Python
SciPy 教程 之 Scipy 显著性检验 6
显著性检验是统计学中用于判断样本与总体假设间是否存在显著差异的方法。SciPy的scipy.stats模块提供了执行显著性检验的工具,如T检验,用于比较两组数据的均值是否来自同一分布。通过ttest_ind()函数,可以获取两样本的t统计量和p值,进而判断差异是否显著。示例代码展示了如何使用该函数进行T检验并输出结果。
14 1
|
16天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第35天】装饰器在Python中是一种强大的工具,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过简明的语言和实际的编码示例,带领读者理解装饰器的概念、用法及其在实际编程场景中的应用,从而提升代码的可读性和复用性。
|
11天前
|
Python
SciPy 教程 之 Scipy 显著性检验 3
本教程介绍Scipy显著性检验,包括其基本概念、原理及应用。显著性检验用于判断样本与总体假设间的差异是否显著,是统计学中的重要工具。Scipy通过`scipy.stats`模块提供了相关功能,支持双边检验等方法。
21 1
|
12天前
|
Python
探索Python中的装饰器:简化代码,提升效率
【10月更文挑战第39天】在编程的世界中,我们总是在寻找使代码更简洁、更高效的方法。Python的装饰器提供了一种强大的工具,能够让我们做到这一点。本文将深入探讨装饰器的基本概念,展示如何通过它们来增强函数的功能,同时保持代码的整洁性。我们将从基础开始,逐步深入到装饰器的高级用法,让你了解如何利用这一特性来优化你的Python代码。准备好让你的代码变得更加优雅和强大了吗?让我们开始吧!
19 1
|
14天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 插值 2
SciPy插值教程:介绍插值概念及其在数值分析中的应用,特别是在处理数据缺失时的插补和平滑数据集。SciPy的`scipy.interpolate`模块提供了强大的插值功能,如一维插值和样条插值。通过`UnivariateSpline()`函数,可以轻松实现单变量插值,示例代码展示了如何对非线性点进行插值计算。
18 3
|
12天前
|
存储 缓存 监控
掌握Python装饰器:提升代码复用性与可读性的利器
在本文中,我们将深入探讨Python装饰器的概念、工作原理以及如何有效地应用它们来增强代码的可读性和复用性。不同于传统的函数调用,装饰器提供了一种优雅的方式来修改或扩展函数的行为,而无需直接修改原始函数代码。通过实际示例和应用场景分析,本文旨在帮助读者理解装饰器的实用性,并鼓励在日常编程实践中灵活运用这一强大特性。
|
15天前
|
机器学习/深度学习 数据采集 人工智能
探索机器学习:从理论到Python代码实践
【10月更文挑战第36天】本文将深入浅出地介绍机器学习的基本概念、主要算法及其在Python中的实现。我们将通过实际案例,展示如何使用scikit-learn库进行数据预处理、模型选择和参数调优。无论你是初学者还是有一定基础的开发者,都能从中获得启发和实践指导。
34 2
|
15天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
25 1
下一篇
无影云桌面