以下是一个使用 C++ 和 OpenCV 实现频率域图像增强的示例代码,包括图像的傅立叶变换及逆傅立叶变换,以及理想低通滤波器、巴特沃斯高通滤波器和高斯带通滤波器的实现,并对测试图像进行频率域滤波增强处理: ```cpp #include <opencv2/opencv.hpp> #include <iostream> // 傅立叶变换 cv::Mat fft(cv::Mat image) { cv::Mat planes[] = { cv::Mat_<float>(image), cv::Mat::zeros(image.size(), CV_32F) }; cv::Mat complexImage; cv::merge(planes, 2, complexImage); cv::dft(complexImage, complexImage); return complexImage; } // 逆傅立叶变换 cv::Mat ifft(cv::Mat complexImage) { cv::idft(complexImage, complexImage); cv::Mat planes[2]; cv::split(complexImage, planes); cv::normalize(planes[0], planes[0], 0, 255, cv::NORM_MINMAX); return planes[0]; } // 理想低通滤波器 cv::Mat idealLowPassFilter(cv::Size size, double cutoffFrequency) { cv::Mat filter = cv::Mat::zeros(size, CV_32F); int centerX = size.width / 2; int centerY = size.height / 2; for (int i = 0; i < size.height; i++) { for (int j = 0; j < size.width; j++) { double distance = std::sqrt((i - centerY) * (i - centerY) + (j - centerX) * (j - centerX)); if (distance <= cutoffFrequency) { filter.at<float>(i, j) = 1.0; } } } return filter; } // 巴特沃斯高通滤波器 cv::Mat butterworthHighPassFilter(cv::Size size, double cutoffFrequency, int order) { cv::Mat filter = cv::Mat::zeros(size, CV_32F); int centerX = size.width / 2; int centerY = size.height / 2; for (int i = 0; i < size.height; i++) { for (int j = 0; j < size.width; j++) { double distance = std::sqrt((i - centerY) * (i - centerY) + (j - centerX) * (j - centerX)); filter.at<float>(i, j) = 1.0 / (1.0 + std::pow(cutoffFrequency / distance, 2 * order)); } } return filter; } // 高斯带通滤波器 cv::Mat gaussianBandPassFilter(cv::Size size, double centerFrequency, double bandwidth) { cv::Mat filter = cv::Mat::zeros(size, CV_32F); int centerX = size.width / 2; int centerY = size.height / 2; for (int i = 0; i < size.height; i++) { for (int j = 0; j < size.width; j++) { double distance = std::sqrt((i - centerY) * (i - centerY) + (j - centerX) * (j - centerX)); double gaussian = std::exp(-(distance - centerFrequency) * (distance - centerFrequency) / (2 * bandwidth * bandwidth)); filter.at<float>(i, j) = gaussian; } } return filter; } int main() { cv::Mat image = cv::imread("test.jpg", cv::IMREAD_GRAYSCALE); cv::Mat complexImage = fft(image); // 理想低通滤波 cv::Mat idealLowPass = idealLowPassFilter(image.size(), 50.0); cv::Mat filteredComplexImageIdeal = complexImage.mul(idealLowPass); cv::Mat filteredImageIdeal = ifft(filteredComplexImageIdeal); // 巴特沃斯高通滤波 cv::Mat butterworthHighPass = butterworthHighPassFilter(image.size(), 50.0, 2); cv::Mat filteredComplexImageButterworth = complexImage.mul(butterworthHighPass); cv::Mat filteredImageButterworth = ifft(filteredComplexImageButterworth); // 高斯带通滤波 cv::Mat gaussianBandPass = gaussianBandPassFilter(image.size(), 100.0, 50.0); cv::Mat filteredComplexImageGaussian = complexImage.mul(gaussianBandPass); cv::Mat filteredImageGaussian = ifft(filteredComplexImageGaussian); cv::imshow("Original Image", image); cv::imshow("Ideal Low Pass Filtered Image", filteredImageIdeal); cv::imshow("Butterworth High Pass Filtered Image", filteredImageButterworth); cv::imshow("Gaussian Band Pass Filtered Image", filteredImageGaussian); cv::waitKey(0); return 0; } ``` 额外需要注意的逻辑点: 1. 滤波器的参数选择需要根据具体的图像和需求进行调整。 2. 处理过程中要注意数据类型的转换和范围的控制,以避免数值溢出或精度损失。 3. 图像的读取和显示要确保路径正确并且格式支持。 [2025-03-27 10:36:05 | AI写代码神器 | 1280点数解答]