频率域滤波步骤
共7步骤:
1
4
6.
cpp
cv::Mat input = cv::imread("1.JPG", cv::IMREAD_GRAYSCALE);
cv::imshow("step0_ori", input);
int w = cv::getOptimalDFTSize(input.cols);
int h = cv::getOptimalDFTSize(input.rows);
cv::Mat padded;
cv::copyMakeBorder(input, padded, 0, h - input.rows, 0, w - input.cols,
cv::BORDER_CONSTANT, cv::Scalar::all(0));
padded.convertTo(padded, CV_32FC1);
cv::imshow("step1_padded", padded);
for (int i = 0; i < padded.rows; i++)
{
float* ptr = padded.ptr<float>(i);
for (int j = 0; j < padded.cols; j++)
ptr[j] *= pow(-1, i + j);
}
cv::imshow("step2_center", padded);
cv::Mat plane[] = { padded,cv::Mat::zeros(padded.size(),CV_32F) };
cv::Mat complexImg;
cv::merge(plane, 2, complexImg);
cv::dft(complexImg, complexImg);
cv::split(complexImg, plane);
cv::magnitude(plane[0], plane[1], plane[0]);
plane[0] += cv::Scalar::all(1);
cv::log(plane[0], plane[0]);
cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
cv::imshow("dft", plane[0]);
cv::Mat gaussianBlur(padded.size(), CV_32FC2);
float D0 = 2 * 10 * 10;
for (int i = 0; i < padded.rows; i++)
{
float* p = gaussianBlur.ptr<float>(i);
for (int j = 0; j < padded.cols; j++)
{
float d = pow(i - padded.rows / 2, 2) + pow(j - padded.cols / 2, 2);
p[2 * j] = expf(-d / D0);
p[2 * j + 1] = expf(-d / D0);
}
}
cv::split(gaussianBlur, plane);
cv::magnitude(plane[0], plane[1], plane[0]);
plane[0] += cv::Scalar::all(1);
cv::log(plane[0], plane[0]);
cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
cv::imshow("gaussianBlurKernel", plane[0]);
multiply(complexImg, gaussianBlur, gaussianBlur);
cv::split(gaussianBlur, plane);
cv::magnitude(plane[0], plane[1], plane[0]);
plane[0] += cv::Scalar::all(1);
cv::log(plane[0], plane[0]);
cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
cv::imshow("gaussianBlurOnDFT", plane[0]);
cv::idft(gaussianBlur, gaussianBlur);
cv::split(gaussianBlur, plane);
cv::magnitude(plane[0], plane[1], plane[0]);
cv::normalize(plane[0], plane[0], 1, 0, cv::NORM_MINMAX);
cv::imshow("idft-gaussianBlur", plane[0]);
cv::waitKey();