OpenCV2.4とC++を使用して画像スペクトルにノッチフィルターを適用するにはどうすればよいですか?画像のDFTを計算し、特定の周波数を抑制し、逆dftを計算したいと思います。周波数ドメインでノッチフィルターを適用する方法のサンプルコードを誰かに教えてもらえますか?
編集:
これが私が試したものですが、周波数スペクトルの象限が整然としていないため、スペクトルの原点は画像の中心ではありません。そのため、抑制すべき周波数を特定することは困難です。原点が中心になるように象限を交換すると、逆DFTは間違った結果を示します。スワップされた象限で逆dftを実行する方法を誰かに教えてもらえますか?
頻度画像filter1とfilter2の列数がわかりません(コードを参照)。forループでuとしてfilter1.colsを使用すると、画像の右側の境界線にアクセスできません。Filter1とfilter2は約 5000列ですが、ソース画像の解像度は1280x1024(グレースケール)です。それについて何か考えはありますか?
私のコードについてさらにコメントはありますか?
Mat img;
img=imread(filename,CV_LOAD_IMAGE_GRAYSCALE);
int M = getOptimalDFTSize( img.rows );
int N = getOptimalDFTSize( img.cols );
Mat padded;
copyMakeBorder(img, padded, 0, M - img.rows, 0, N - img.cols, BORDER_CONSTANT, Scalar::all(0));
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg,cv::DFT_SCALE|cv::DFT_COMPLEX_OUTPUT);
split(complexImg, planes);
Mat filter1;
planes[0].copyTo(filter1);
Mat filter2;
planes[1].copyTo(filter2);
for( int i = 0; i < filter1.rows; ++i)
{
for(int u=7;u<15;++u)
{
filter1.at<uchar>(i,u)=0;
filter2.at<uchar>(i,u)=0;
}
Mat inverse[] = {filter1,filter2};
Mat filterspec;
merge(inverse, 2, filterspec);
cv::Mat inverseTransform;
cv::dft(filterspec, inverseTransform,cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);
cv::Mat finalImage;
inverseTransform.convertTo(finalImage, CV_8U);