天天看点

C++ OpenCV去燥函数fastNlMeansDenoising的使用

本文长度为1857字,预计阅读5分钟​

前言

在使用OpenCV进行图像处理时,一般都使用高斯滤波或是中值滤波进行去噪,原理也是选取像素周围一个小的邻域铂高斯或中值平均取代中心像素。而今天介绍的NlMeans是对整幅图像进行去噪。

C++ OpenCV去燥函数fastNlMeansDenoising的使用

实现效果

C++ OpenCV去燥函数fastNlMeansDenoising的使用

上图中右边为使用fastNlMeansDenoising去燥后的效果,可以看出来,整张图片的清晰度和原图基本无变化 ,标红框的地方可以看到平滑了好多。如果使用高斯或是中值滤波,图像会变的模糊些。

fastNIMeansDenosing介绍

C++ OpenCV去燥函数fastNlMeansDenoising的使用

微卡智享

NL-Means的全称是:Non-Local Means,又称做非局部平均去燥,是利用了整幅图进行了去燥,所以相对来说,运行时消耗的时间也会更多。

耗时对比

C++ OpenCV去燥函数fastNlMeansDenoising的使用

Debug模式下耗时:39074.4毫秒,足足接近了40秒

C++ OpenCV去燥函数fastNlMeansDenoising的使用

Release模式下耗时:576.84毫秒,不到1秒

(还是那句话Release模式要比Debug快N倍)

fastNlMeansDenoising相关函数

  • fastNlMeansDenoising() - 使用单个灰度图像
  • fastNlMeansDenoisingColored() - 使用彩色图像。
  • fastNlMeansDenoisingMulti() - 用于在短时间内捕获的图像序列(灰度图像)
  • fastNlMeansDenoisingColoredMulti() - 与上面相同,但用于彩色图像。

这篇我们只用到了第二个fastNlMeansDenoisingColored

CV_EXPORTS_W void fastNlMeansDenoisingColored( InputArray src, OutputArray dst,
        float h = 3, float hColor = 3,
        int templateWindowSize = 7, int searchWindowSize = 21
        
//参数说明:
//src 输入图像
//dst 输出图像
//h 决定过滤器强度。h 值高可以很好的去除噪声,但也会把图像的细节抹去。(取 10 的效果不错)
//hColor 与h相同,使用于彩色图像
//templateWindowSize 奇数。(推荐值为 7)
//searchWindowSize 奇数。(推荐值为 21)      

完整代码

#include <iostream>
#include <opencv2/opencv.hpp>
#include "CvUtils.h"


using namespace cv;
using namespace std;


int main(int argc, char** argv) {
  Mat src = imread("E:/DCIM/person/song5.jpg");
  CvUtils::MatResize(src);
  CvUtils::SetShowWindow(src, "src", 50, 50);
  imshow("src", src);


  //fastNlMeansDenoisingColored
  double time = getTickCount();
  Mat denoisingdst;
  fastNlMeansDenoisingColored(src, denoisingdst);
  time = getTickCount() - time;
  cout << "运行时间:" << time / getTickFrequency() * 1000 << endl;


  CvUtils::SetShowWindow(denoisingdst, "denoising", src.cols+70, 50);
  imshow("denoising", denoisingdst);


  waitKey(0);
  return 0;
}      

1

简单美颜

在找不同图片进行测试时,发现了用这个函数可以实现一个简单的美颜效果,直接上图。

C++ OpenCV去燥函数fastNlMeansDenoising的使用

看看右边,直接就是磨过皮的嘛!!!

源码地址

​​https://github.com/Vaccae/OpenCVDemoCpp.git​​

点击下方的原文链接可以跳转到码云的源码地址。

C++ OpenCV去燥函数fastNlMeansDenoising的使用