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

2021-04-21 16:23:32 浏览数 (1)

学更好的别人,

做更好的自己。

——《微卡智享》

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

前言

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

实现效果

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

fastNIMeansDenosing介绍

微卡智享

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

耗时对比

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

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

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

fastNlMeansDenoising相关函数

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

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

代码语言:javascript复制
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)

完整代码

代码语言:javascript复制
#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

简单美颜

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

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

源码地址

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

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

0 人点赞