C++ OpenCV 实战:实现傅立叶变换、逆变换及多类型滤波器进行频率域图像增强
以下是一个使用 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. 图像的读取和显示要确保路径正确并且格式支持。 ######[AI写代码神器 | 1280点数解答 | 2025-03-27 10:36:05]
- 揭秘!任意各位不同三位数经变换最终如何锁定 495 及编程求解变换次数(字节豆包 | 167点数解答 | 2025-04-22 20:47:58)328
- MySQL 数据库操作:用德鲁伊连接池和 Spring JDBC 实现 MVC 架构下 Student 表操作及事务测试全解析(字节豆包 | 1115点数解答 | 2025-03-19 11:17:31)308
- Spring JDBC+德鲁伊连接池:MVC架构下MySQL学生表查询、事务验证及代码实现全解析(DeepSeek | 1275点数解答 | 2025-03-19 11:21:32)295
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)369
- Verilog 实现 8 位无符号二阶 7 点Savitzky - Golay 光谱曲线平滑滤波及注意要点 (字节豆包 | 404点数解答 | 2025-05-14 16:28:03)168
- 工程师必看!LoadRunner 性能测试标准流程全揭秘 (百度文心 | 215点数解答 | 2023-11-09 18:25:31)391
- OpenCV.js 轻松实现图片识别:详细步骤全解析 ( | 824点数解答 | 2024-03-22 16:22:16)204
- OpenCV.js 实战:轻松识别图片中电梯轮廓( | 1193点数解答 | 2024-03-22 16:23:32)219
- 用 C++ 和 OpenCV 生成带随机偏移的圆周上的点:代码剖析(字节豆包 | 29点数解答 | 2024-11-06 23:40:42)271
- Mac版PS 2019CC:超实用图片美颜增强PS脚本大揭秘!(字节豆包 | 309点数解答 | 2025-02-22 20:49:53)167
- PS 20.0.6 版实用美颜增强脚本大揭秘!(字节豆包 | 192点数解答 | 2025-02-28 11:01:21)242
- PS 20.0.6 实用美颜脚本:含代码及三大使用注意点 (阿里通义 | 680点数解答 | 2025-02-28 14:43:51)231