Как я могу применить режекторный фильтр к спектру изображения, используя OpenCV 2.4 и C ++? Я хочу рассчитать ДПФ изображения, подавить определенные частоты и рассчитать обратный ДПФ. Может кто-нибудь показать мне пример кода, как применить режекторный фильтр в области частот?
РЕДАКТИРОВАТЬ:
Вот то, что я пробовал, но квадранты частотного спектра не в порядке, поэтому источник спектра не является центром изображения. Это затрудняет мне определение частот для подавления. При обмене квадрантов так, чтобы источник был центром, обратное ДПФ показывает неверные результаты. Может кто-нибудь показать мне, как сделать обратный ДПФ с поменять местами?
Я не понимаю количество столбцов в частотных изображениях filter1 и filter2 (см. Код). Если я использую filter1.cols как u в цикле for, я не получаю доступ к правой границе изображений. Filter1 и filter2, кажется, имеют ок. 5000 столбцов, но исходное изображение имеет разрешение 1280×1024 (оттенки серого). Есть мысли по этому поводу?
Еще комментарии по поводу моего кода?
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);
Задача ещё не решена.
Других решений пока нет …