基于Python实现种差值方法(完整代码详细教程)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
三种插值方法都是使用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对于数值计算有更好的优化。
完整代码