0

セクションの「5 行」を削除しようとしています。楽譜では、元の画像は次のとおりです: http://en.wikipedia.org/wiki/Requiem_(Mozart)#/media/File:K626_Requiem_Mozart.jpg

まず、ガウス フィルターを適用し、しきい値 (最小: 100、最大 255) で 2 値化します。次に、この画像にdftを適用し、適切な線をいくつか消去し、逆dftによって画像を再構築します。

私はopencvのドキュメントでサンプルコードを使用していますが、実際にはこのコードを理解しているかどうか疑問に思っています。:( http://docs.opencv.org/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html

このサンプル コードでは、2 つのマットがあります。1 つはスペクトルの 'complexI' で、もう 1 つは実際の可視化の 'magI' です。cv::dft の結果は complexI で、magI は正規化された complexI です。私の質問はこれです。黒い線を追加して(周波数ドメインでキャンセルする)、再構築するにはどうすればよいですか?

4

1 に答える 1

1

OpenCV (現在) は、スペクトル フィルタリングによって周期的なノイズを処理する方法に関する詳細なチュートリアルを提供しています: https://docs.opencv.org/trunk/d2/d0b/tutorial_periodic_noise_removing_filter.html

cv::dft()cv::idft()cv::mulSpectrums()、およびを使用することにかかっていcv::magnitude()ます。

フィルタリングを実行するコア関数 (チュートリアルから) は次のようになります。

void filter2DFreq(const Mat& inputImg, Mat& outputImg, const Mat& H)
{
    Mat planes[2] = { Mat_<float>(inputImg.clone()), Mat::zeros(inputImg.size(), CV_32F) };
    Mat complexI;
    merge(planes, 2, complexI);
    // find FT of image
    dft(complexI, complexI, DFT_SCALE);

    Mat planesH[2] = { Mat_<float>(H.clone()), Mat::zeros(H.size(), CV_32F) };
    Mat complexH;
    merge(planesH, 2, complexH);
    Mat complexIH;

    // apply spectral filter
    mulSpectrums(complexI, complexH, complexIH, 0);

    // reconstruct the filtered image
    idft(complexIH, complexIH);

    split(complexIH, planes);
    outputImg = planes[0];
}

詳細については、チュートリアルを参照してください。

于 2019-02-13T21:06:43.757 に答える