基于Python实现种差值方法(完整代码详细教程)

news2024/11/17 11:49:40

三种插值方法都是使用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格式计算后问题就被规避了:

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

二、随机丢点的评估


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

2.1 肉眼观察


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

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

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

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

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

2.2 指标变化曲线


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

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

RBF三种基函数比较

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

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

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

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


3.1 结果展示


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

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

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

可以看出仍然是最近邻算法的修复效果最差,尤其是对于画线的涂鸦部分,并且“董威龙”文字的部分修复效果也不好,因这个三个字笔画比较多,涂鸦效果基本和画线一样。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 极限测试


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(十八)Threads异步和多线程(Thread、Threadpool、Task)-语言进阶2

Threads异步和多线程-语言进阶2一、Thread1. 线程启动2. 线程等待3.前台线程/后台线程4.扩展thread封装回调二、Threadpool1.线程池2.线程池使用3.ManualResetEvent 线程池等待三、Task1. Task启动方式2.waitall 、waitany1.waitall2.waitany3.WaitAll、waitany场景4. 应用&…

Spring为什么这么火 之 Spring的创建及存储、获取Bean对象

目录 1、创建Spring项目 1.1、创建一个Maven项目 1.2、添加Spring框架支持 1.3、添加启动类 2、存储Bean对象 2.1、创建Bean对象 2.2、将Bean对象注册到Spring容器中 3、获取、使用Bean对象 3.1、得到Spring上下文对象 使用ApplicationContext作为Spring的上下文 【更…

服务器相关命令(docker相关)

一:安装docker 之前安装过旧版本,使用以下命令可以卸载(整个copy过去): yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-e…

AOP面向切面编程

AOP 面向切面编程 AOP是什么 AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续,是软件开发中的一个热点,是 j…

【Linux】-- 环境变量

目录 环境变量 常见环境变量 HOME 和环境变量相关的命令 通过代码如何获取环境变量 环境变量参数 通过第三方变量environ获取 通过getenv函数来特定访问获取 通过setenv函数来特定访问获取 环境变量 命令:which ls 将命令ls的完整路径写入到标准输出。 #in…

用R语言理解洛必达法则

文章目录5 洛必达法则极限的种类洛必达法则作用于幂函数5 洛必达法则 极限的种类 令NNN为常数,则常规的极限运算大致有以下几种 ∞N∞∞⋇N∞(N̸0)N∔∞∞N−∞−∞N/∞0N/0∞N∞∞(N̸1)∞N∞(N̸0)\begin{matrix} &\infty\pm N\infty\quad&\infty\divi…

MySQL版本由5.7.37更新到5.7.39

一、前景 由于mysql5.7.37存在漏洞,影响系统安全,所以需要将mysql版本升级到5.7的最新版本5.7.39。 二、步骤 1、下载5.7.39的安装包: 下载链接如下: https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.39-1.el…

node基础知识

node基础知识 node在真实项目中的应用 webpack基于node环境 用nodejs的语法合并压缩打包 js放到客户端浏览器中执行 放到服务器端运行:java因为jdk php因为tomcat c#因为有.net framework 项目架构1:中小型项目-基于nodejs构建全栈 项目架构2&#xff1a…

mysql转DM达梦数据库+springboot兼容DM数据库+springboot兼容activity5.22.0

由于现在做的项目中需要针对数据库进行国产化操作,最终完成从mysql到达梦的迁移,记录整合迁移记录如下:安装初始化达梦数据库(傻瓜式安装即可)安装达梦数据库(windows、linux)初始化数据库实例关…

代码质量与安全 | 新时代:2023年商业软件开发的五大关键目标

进入2023年,技术趋势仍然聚焦于人工智能、边缘智能和气候变化领域,但供应链增速放缓和日益增长的消费者需求阻碍着创新的步伐。为了在行业中保持竞争力,并实现软件工程预定目标,软件开发领导者需要主动制定预算和时间管理计划&…

Java设计模式-模板模式Template

介绍 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),z 在一个抽象类公开定义了执行。它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说&#xff…

中移链合约常用开发介绍 (二)多索引表的使用

一、目的本文详细介绍了开发、部署和测试一个地址簿的智能合约的流程,适用于EOS的初学者了解如何使用智能合约实现本地区块链上数据的持久化和对持久化数据的增删改查。二、智能合约介绍区块链作为一种分布式可信计算平台,去中心化是其最本质的特征。每笔…

17.Isaac教程--机器学习流程

机器学习流程 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录机器学习流程模拟训练PC 和边缘设备上的推理使用 TensorRT 进行推理Torch推理使用 Tensorflow 进行推理示例PyCodelet配套代码Tensorflow 推理小码TensorRT 推理小码SampleAc…

23种设计模式(三)——模板方法模式【组件协作】

文章目录意图什么时候使用模板方法真实世界类比常说的钩子模板方法的实现模板方法模式的优缺点亦称: Template Method 意图 它的主要思想是,定义一个操作的一系列步骤,对于某些暂时确定不下来的步骤,就留给子类去实现好了&#x…

位图与矢量图的区别

相信大家在日常的工作过程中,经常会听到位图和矢量图,那么位图和矢量图的区别是什么呢? 1.定义 ①位图:称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这 些点可以进行不同的排…

测试用例设计方法有哪些?举例说明

众所周知,测试用例是编制的一组测试输入、执行条件及预期结果,专门为的是某个特殊目标,即测试某个程序路径,或是核实是否满足某个特定的需求。一般来讲,常用的测试用例设计方法有五种,分别是:正…

微信小程序中如何实现双向绑定

一、双向绑定 在微信小程序中如何实现双向绑定?在开始之前先介绍下什么是双向绑定,js中定义变量数据后,通过{{}}绑定到模板中,这个过程是单向绑定,即数据的更新只能是js中更新了数据,模板中跟着修改。但是如…

深度学习笔记:神经网络(3)

关于本章之前内容可以参考以下之前文章: 1 https://blog.csdn.net/Raine_Yang/article/details/128473486?spm1001.2014.3001.5501 2 https://blog.csdn.net/Raine_Yang/article/details/128584916?spm1001.2014.3001.5501 神经网络的输出层设计 机器学习问题一般…

2022年12月青少年软件编程(Python) 等级考试试卷(三级)

2022. 12 青少年软件编程(Python) 等级考试试卷(三级) 一、 单选题(共 25 题, 共 50 分) 1.列表 L1 中全是整数, 小明想将其中所有奇数都增加 1, 偶数不变, 于是编写了如下图 所示的…

高级树结构之平衡二叉树(ALV树)

文章目录平衡二叉树简介失衡类型&处理办法RR型失衡【左旋调整】调整演示代码实现LL型失衡【右旋调整】调整演示代码实现RL型失衡【先右旋后左旋调整】调整演示代码实现LR型失衡【先右旋后左旋调整】调整演示代码实现插入操作综合代码演示平衡二叉树简介 在数据有序的情况下…