基本原理
该算法来自论文《A non-local algorithm for image denoising》去噪属于图像复原的范畴,通常使用滤波来实现,并且往往是低通(平滑噪声)滤波器。对于单帧图像去噪,使用空间邻域像素来处理,对于多帧图像去噪,则可以考虑时空域相结合的方法,即时间+空间的3DNR方法。
简单的平滑滤波器有均值滤波器、高斯滤波器,算法复杂度低,但会导致图像模糊,双边滤波器是性能较好的非线性滤波器,在去噪的同时,保留了较强的纹理细节,缺点是弱的纹理被滤掉了。非局部均值(Non Local Means)方法,不仅仅考虑了像素的较小邻域,并且邻域点的权重由该点与滤波点相似度计算得到。
NLM去噪后输出图像定义如下:
其中I为搜索区域,w(i,j)为权重,由匹配块的相似度决定。
块的相似度定义如下:
该值由表示点i和j邻域差值平方卷积高斯核,表征邻域相似度,Z(i)表示权重归一化系数。
示例演示
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//if (argc != 2)
//{
// cout << "Usage: opencv_test <image path>" << endl;
// return -1;
//}
//char *imgName = argv[1];
char *imgName = "C:\\Users\\VINNO\\Desktop\\src0\\die.jpg";
Mat inputImg;
inputImg = imread(imgName, 1);
if (!inputImg.data)
{
cout << "No image data" << endl;
return -1;
}
Mat resultImg;
fastNlMeansDenoisingColored(inputImg, resultImg, 10, 10, 7, 21);
imwrite("./result.jpg", resultImg);
imshow("", resultImg);
waitKey(0);
return 0;
}