基于模块区分度的统计及可视化
概述12graph TD A(取2*2像素格为单位)-->B(计算8邻域区分度)-->C(统计每单位区分度大于阈值的个数)-->D(将计数为0的单位设为255)
素材
计算区分度1234567891011121314def get_dif(img): raw, col = img.shape dif = np.zeros((raw - 1, col - 1, 8), dtype=int) for i in range(raw - 1): for j in range(col - 1): for m in range(8): d = get_1D_2_2D(m) if(i + d[0] >= 0 and i + d[0] + 1 <= raw - 1 and j + d[1] >= 0 and j + d[1] + 1 <= col -1): dif[i][j][m] = abs(int(img ...
基于模块差的3*3子图的对比
素材原图:https://gitee.com/icvuln/server_backup_denoise18/blob/master/rsc/03.png
k = 3分为9张子图详见:https://gitee.com/icvuln/server_backup_denoise18/blob/master/one2k.py
12345678910111213141516171819202122232425import cv2 as cvimport numpy as npdef separate(img, k): row, col = img.shape kimg = np.zeros((k, k, row//k, col//k), dtype=int) for i in range(0, row, k): for j in range(0, col, k): for m in range(k): for n in range(k): if i//k < row ...
基于模块差的取子图情况下的对比
k = 2分为四张子图
分别求max-min
比对
基于模块差的统计情况呈现
素材
min与max的分布结果
代码示例123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111# python3.6# utf-8# LFimport cv2 as cvimport numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom mpl_toolkits.mplot3d import Axes3Dimport show_3ddef get_1D_2_2D(x): d = {0:[-1, -1], 1:[-1, 0], 2:[-1, 1], 3:[0, 1], 4:[1, 1], 5:[1, 0], ...
基于模块差的统计情况进行实验
素材
max统计
min统计
max图大于60为白色
min图小于20为白色
代码示例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071# python3.6# utf-8# LFimport cv2 as cvimport numpy as npimport matplotlib.pyplot as pltdef get_1D_2_2D(x): d = {0:[-1, -1], 1:[-1, 0], 2:[-1, 1], 3:[0, 1], 4:[1, 1], 5:[1, 0], 6:[1, -1], 7:[0, -1]} return d[x]def get_dif(img): raw, col = img.shape dif = np.zeros((raw - 1, col - 1, 8)) for i in ra ...
基于像素点分类优化DnCNN
概述对DnCNN算法进行优化DnCNN算法基于残差思想进行降噪,那么利用手工方法将“大概率噪声”“大概率非噪声”“其他”分类后进行训练,可能会有更好的效果
分析原先拟通过修改loss函数的方式来完成上述过程,但实际上DnCNN的loss函数直接调用了pytorch的mse方法,如下:
1torch.nn.functional.mse_loss(input, target, size_average=None, reduce=None, reduction='sum').div_(2)
其loss函数是对图像整体进行黑盒运算,所以现在采用一种等效方法。
原图X + noise = 噪声图Y
Y中必然含有“大概率噪声A”“大概率非噪声B”“其他C”,那么可以简单生成三张子图,如取“大概率噪声A”和X中与B、C对应的像素就可以生成一张子图,当取B或C时,也以此类推
若如此做,便在实际意义上也是对这三类像素分开进行训练
训练结果没有修改原训练参数,默认训练180 epochs
1180 1860 / 1862 loss = 1.2376
测试结果本次训练
1234202 ...
DnCNN
DnCNN这篇论文算是使用CNN进行图像降噪最为经典的算法之一,算法并不复杂,但是在PSNR的指标上超过了BM3D,该算法框架如下图所示:
网络学习的是图像残差,也就是带噪图像和无噪图像差值,损失函数采用的MSE
由于DnCNN是当前比较基础的模型之一,加之之后迭代升级的模型较为复杂,所以先在DnCNN上尝试
DnCNN的实现环境配置由于论文中所用的pytorch版本太低,所以部分代码为了适用于高版本而被修改
test效果
基于深度学习的降噪思想
经过各类文献调研,总结如下
典型模型最典型的模型为CNN模型,各类基于CNN的模型也很多,其中如DnCNN -> FFDNet -> CBDNet -> RIDNet -> PMRID是一条越来越优的降噪网络主线
其他不同的模型也存在,但思路相仿
降噪思路核心思路残差思想
训练
有干净图像数据集X
利用特定噪声类型,生成特殊噪声数据集V
利用加噪算法合成X与V,生成图像数据集Y(即X + V = Y)
将X与Y配对,进行训练
预测输入Y,进行盲去噪
预测输出V‘,从而能较容易得到X’ = Y - V‘
分析该种残差思想,无需考虑单个像素点是否为噪声(无需求出结果),只需要预测出残差,并进行直接的修改
存在的问题这样的方法只能在实验中对标实验所需要的人为特定噪声(如,人为加入高斯噪声),但是噪声种类过多,在现实中,往往不能得到好的效果。
改进方法另有论文(The classification and denoising of image noise based on deep neural networks)提供了改进的方法
大致思路为,在降噪之前,先进行噪声种 ...