1. ホーム
  2. c++

[解決済み] fastNlMeansDenoising() はノイズをフィルタリングしない

2022-02-11 13:01:45

質問

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;
}

出力画像です。

スムージングの効果が見られません。理由がわかりません。 ノイズを除去するためにこの関数を使用する方法を教えてください。

解決方法は?

OpenCVでは、この関数は次のように定義されています。

void fastNlMeansDenoising(InputArray src, OutputArray dst, float h=3, int templateWindowSize=7, int searchWindowSize=21 )

ここで

パラメータ: src - 入力 8 ビット,1 チャンネル,2 チャンネル,または 3 チャンネル.

dst - src と同じサイズ,同じ型の出力画像.

templateWindowSize - テンプレートパッチのピクセル単位でのサイズ. を使用して重みを計算する。奇数でなければならない。推奨値 7ピクセル

searchWindowSize - 探索ウィンドウのサイズ(ピクセル). 指定されたピクセルの加重平均を計算する。奇数でなければならない。影響 性能は直線的:大きい

searchWindowsSize - ノイズ除去が大きい。 の時間を短縮することができます。推奨値 21ピクセル

h - フィルタを制御するパラメータ の強さです。h 値が大きいとノイズは完全に除去されますが、画像も除去されます。 h値を小さくすると、ディテールは維持されるが、いくつかのディテールも維持される。 ノイズ

そのため、ノイズを除去するためには、フィルター強度のパラメーターを大きくする必要がありました h h値を大きくするとノイズが完全に除去されますが、h値を小さくするとディテールが保たれ、ノイズもある程度保たれます。

そこで、このような関数を使ってノイズを完全に除去してみました。

fastNlMeansDenoising(img_gray, img1, 30.0, 7, 21);

出力します。

この関数は、デバッグモードでは実行時間がかかりすぎます。少しでも早く実行したい場合は、リリースモードで実行することをお勧めします。