fastNlMeansDenoising()不会滤除噪声

Abc*_*Abc 3 c++ opencv

我正在尝试通过opencv fastNlMeansDenoising()函数消除噪声。但是我的输出图像与原始噪点图像相同。

输入图片:

在此处输入图片说明

码:

#include <iostream>

#include <opencv2/opencv.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

using namespace std;

using namespace cv;


int main() {

    Mat img = imread("noisy.jpg");

    if (!img.data) {
        cout << "File not found" << endl;
        return -1;
    }

    // first copy the image
    Mat img_gray = img.clone();
    cvtColor(img, img_gray, CV_RGB2GRAY);

    Mat img1;
    //fastNlMeansDenoising(img_gray, img1, 3.0, 7, 21);
    cv::fastNlMeansDenoising(img_gray, img1, 3.0, 7, 21);

    imshow("img1", img1);

    waitKey();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出图像:

在此处输入图片说明

我看不到任何平滑效果。我不明白原因。请帮助我使用此功能消除噪音。谢谢

Abc*_*Abc 6

在opencv中,函数定义如下

void fastNlMeansDenoising(InputArray src, OutputArray dst, float h=3, int templateWindowSize=7, int searchWindowSize=21 )
Run Code Online (Sandbox Code Playgroud)

哪里

Parameters: 
src – Input 8-bit 1-channel, 2-channel or 3-channel image.
dst – Output image with the same size and type as src .
templateWindowSize – Size in pixels of the template patch that is used to compute weights. Should be odd. Recommended value 7 pixels
searchWindowSize – Size in pixels of the window that is used to compute weighted average for given pixel. Should be odd. Affect performance linearly: greater searchWindowsSize - greater denoising time. Recommended value 21 pixels
h – Parameter regulating filter strength. Big h value perfectly removes noise but also removes image details, smaller h value preserves details but also preserves some noise
Run Code Online (Sandbox Code Playgroud)

因此,为了消除噪声,我必须增加滤波器强度参数h,较大的h值可以完全消除噪声,但是较小的h值可以保留细节,还可以保留一些噪声。

所以我可以通过使用这样的功能来完美消除噪音。

fastNlMeansDenoising(img_gray, img1, 30.0, 7, 21);
Run Code Online (Sandbox Code Playgroud)

输出:

滤波强度为30的降噪图像

注意:在调试模式下,此函数的执行时间太慢。为了加快执行时间,最好在发布模式下运行它。

希望这对干杯有帮助