c++opencv实现频率域图像增强


在C++中使用OpenCV库实现频率域图像增强,通常涉及以下几个步骤: 1. 读取图像。 2. 将图像转换为灰度图(如果需要)。 3. 对图像进行傅里叶变换。 4. 应用滤波器(如高通滤波器、低通滤波器等)到频域图像。 5. 对处理后的频域图像进行逆傅里叶变换。 6. 显示或保存结果。 下面是一个简单的示例代码,演示如何使用OpenCV在C++中实现频率域的图像增强: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像 Mat image = imread("path_to_image.jpg", IMREAD_GRAYSCALE); if (image.empty()) { cout << "Could not open or find the image" << endl; return -1; } // 扩展图像以优化DFT性能 Mat padded; int m = getOptimalDFTSize(image.rows); int n = getOptimalDFTSize(image.cols); copyMakeBorder(image, padded, 0, m - image.rows, 0, n - image.cols, BORDER_CONSTANT, Scalar::all(0)); // 创建复数矩阵来存储DFT结果 Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)}; Mat complexI; merge(planes, 2, complexI); // 执行DFT dft(complexI, complexI); // 构建高通滤波器 Mat filter = Mat::zeros(padded.size(), CV_32F); int cx = filter.cols / 2; int cy = filter.rows / 2; int radius = 30; // 半径可以根据需要调整 circle(filter, Point(cx, cy), radius, Scalar(1, 1, 1), -1); // 应用滤波器 Mat planesFiltered[2]; split(complexI, planesFiltered); multiply(planesFiltered[0], filter, planesFiltered[0]); multiply(planesFiltered[1], filter, planesFiltered[1]); merge(planesFiltered, 2, complexI); // 执行逆DFT idft(complexI, complexI); // 计算幅度图像 split(complexI, planesFiltered); magnitude(planesFiltered[0], planesFiltered[1], planesFiltered[0]); Mat magImage = planesFiltered[0]; magImage += Scalar::all(1); log(magImage, magImage); // 裁剪和归一化结果图像 magImage = magImage(Rect(0, 0, magImage.cols & -2, magImage.rows & -2)); normalize(magImage, magImage, 0, 1, NORM_MINMAX); // 显示结果 imshow("Input Image", image); imshow("Spectrum Magnitude", magImage); waitKey(); return 0; } ``` 这段代码首先读取一张图片,然后将其转换为灰度图。接着,它通过添加边界来优化DFT的性能,并创建一个复数矩阵来存储DFT的结果。之后,代码构建了一个高通滤波器,并将其应用于频域图像。通过逆DFT转换回空间域,并显示原始图像和频谱幅度图像。 [2024-12-07 12:26:15 | AI写代码神器 | 906点数解答]
- import math class ball: """ 实现 def __init__(self, radius) 函数, 他有一个参数radius, 并为对象初始化一个变量self.radius """ """ 实现 def surface_area(self) 函数, 通过self.radius计算球的表面积, 并将这个表面积返回 """ """ 实现 def volume(self) 函数, 通过self.radius计算球的体积, 并将这个体积返回 """ """ 在评测文件中将这样调用这个类 ball = ball(eval(input())) print("球的半径:{:.2f}".format(ball.radius)) print("球的表面积:{:.2f}".format(ball.surface_area())) print("球的体积:{:(261点数解答 | 2024-11-28 21:19:39)175
- opencv.js 识别图片(824点数解答 | 2024-03-22 16:22:16)156
- opencv.js 识别图片中的电梯轮廓(1193点数解答 | 2024-03-22 16:23:32)175
- #include <random> #include <ctime> using namespace std; #include <opencv2\\opencv.hpp> #include <opencv2\\features2d.hpp> using namespace cv; vector<point2f> pts; // 代码生成的点 const point2f center(200, 200); // 圆心 const float std_r = 100; // 标准半径 // 从 [0, 360) 生成圆周上的点, 都是利用 pt_start 旋转, 再加上一点随机偏移 for (int i = 0; i < 360; i += 8) { default_random_engine e(time(nullptr) + rand()); // 随机 engine uniform_real_distribution<float> u(-8.0f, 8.0f); const float r = std_r + u(e); // 半径 + 误差(29点数解答 | 2024-11-06 23:40:42)148
- 帮我写一段PS脚本,用于图片的美颜,增强 PS版本为Mac版 2019CC(309点数解答 | 2025-02-22 20:49:53)99
- 帮我写一段PS脚本,用于图片的美颜,增强 PS版本为Adobe Photoshop 版本: 20.0.6 20190724.r.80 2019/07/24: 1207344 x64(192点数解答 | 2025-02-28 11:01:21)134
- 帮我写一段PS脚本,用于图片的美颜,增强 PS版本为Adobe Photoshop 版本: 20.0.6 20190724.r.80 2019/07/24: 1207344 x64(680点数解答 | 2025-02-28 14:43:51)123
- 循环点亮 led 灯: (1) 使用定时器to 的方式 1,实现 8个 led 由上至下间隔 1s 流动,其中每个 led 亮 0.5s,灭0.5s,一直重复。。 (2) 使用定时器 to 的方式 1,实现 8个 led 逐个点亮,间隔 1s,一直重复。。(1193点数解答 | 2024-12-27 15:10:29)173
- 在ios开发中,写一个完整的代理,包括声明、实现(268点数解答 | 2023-11-08 00:39:55)184
- 作为javascript开发,简述如何使用animation 实现⾃定义动画 ?(333点数解答 | 2023-11-09 01:50:07)173
- 编写 js 代码,使用 for 循环,实现 1 到 100 相加,将结果输出到页面。(240点数解答 | 2024-05-20 22:11:29)238
- 编写 js 代码,使用 while 循环,实现 1 到 100 相加,将结果输出到页面。(47点数解答 | 2024-05-20 22:16:48)222