文章目录
一、函数介绍
“快速非局部平均去噪” 是消除图像噪声的,在这里也放到了图像平滑这一单原来介绍。这个函数名气不大,不像前面那些函数应用广泛。根据网上专家的介绍,它是利用整幅图像进行去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能够比较好地去掉图像中存在的高斯噪声。因此函数执行要消耗更多的时间,但是结果很好。
1.FastNlMeansDenoising()函数
灰度图进行快速非局部平均去噪时,使用FastNlMeansDenoising()函数,官方定义如下:
public static void FastNlMeansDenoising(
IInputArray src, // 输入图像
IOutputArray dst, // 输出图像
float h = 3f, // 灰度图过滤器强度。h值高可以很好的去除噪声,但也会把图像的细节抹去。
int templateWindowSize = 7, // 相似性权重计算窗口大小(奇数,推荐值为 7)
int searchWindowSize = 21 // 搜索窗口大小,建议是相似性权重计算窗口大小的3-5倍
)
2.FastNlMeansDenoisingColored()
彩色图像进行快速非局部平均去噪时,使用FastNlMeansDenoisingColored()函数,官方定义如下:
public static void FastNlMeansDenoisingColored(
IInputArray src, // 输入图像
IOutputArray dst, // 输出图像
float h = 3f, // 灰度图过滤器强度。h值高可以很好的去除噪声,但也会把图像的细节抹去。
float hColor = 3f, // 彩色图像过滤器强度。h值高可以很好的去除噪声,但也会把图像的细节抹去。
int templateWindowSize = 7, // 相似性权重计算窗口大小(奇数,推荐值为 7)
int searchWindowSize = 21 // 搜索窗口大小,建议是相似性权重计算窗口大小的3-5倍
)
二、举例
1.原始素材
原始素材定义为srcMat,如下:
还是这张熟悉的向日葵图像,里面有白色和黑色的斑点作为椒盐噪声。
2.灰度图FastNlMeansDenoising()快速非局部平均去噪
代码如下:
Mat tempMat = srcMat.Clone();
Mat dstMat = new Mat();
int h = 20; // 灰度图滤器强度
int templateWindowSize = 7; // 相似性权重计算窗口大小(奇数,推荐值为 7)
int searchWindowSize = 21; // 搜索窗口大小,相似性权重计算窗口大小的3-5倍
CvInvoke.CvtColor(tempMat, tempMat, ColorConversion.Bgr2Gray);
CvInvoke.FastNlMeansDenoising(tempMat, dstMat, h, templateWindowSize, searchWindowSize);
代码执行结果如下:
输出结果是一个灰度图,里面绝大多数的的椒盐噪声已经去除掉了,但是在我的笔记本电脑上,代码执行时间用了0.2秒左右,比较慢。
3.彩色图像FastNlMeansDenoisingColored()快速非局部平均去噪
代码如下:
Mat tempMat = srcMat.Clone();
Mat dstMat = new Mat();
int h = 20; // 灰度图滤器强度
int hColor = 20; // 彩色图滤器强度
int templateWindowSize = 7; // 相似性权重计算窗口大小(奇数,推荐值为 7)
int searchWindowSize = 21; // 搜索窗口大小,相似性权重计算窗口大小的3-5倍
CvInvoke.FastNlMeansDenoisingColored(tempMat, dstMat, h, hColor, templateWindowSize, searchWindowSize);
执行结果是:
基本上椒盐噪声也全部去掉了,代码执行时间在0.45秒左右。
注意,在彩色图像去噪时,传入FastNlMeansDenoisingColored()函数的h参数和hColor参数都要设置。
原创不易,请勿抄袭。共同进步,相互学习。