天天看點

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的使用