opencv(c++)低通滤波
时间: 2024-09-12 20:00:36 浏览: 57
在OpenCV(C++)中,低通滤波是一种图像处理技术,用于去除图像中的高频噪声,使得图像变得更加平滑。常见的低通滤波器有均值滤波、高斯滤波和双边滤波等。
1. **均值滤波**:是最简单的滤波方法,它通过每个像素周围固定大小的邻域取平均值来替换该像素值。例如,`cv::blur()`函数就可用于实现均值滤波。
```cpp
Mat src, dst;
int kernelSize = 5; // 滤波核大小
cv::blur(src, dst, Size(kernelSize, kernelSize));
```
2. **高斯滤波**:使用高斯函数作为权重,对像素进行加权平均,效果更好,因为它能抑制噪音的同时保持边缘信息。OpenCV中的`cv::GaussianBlur()`函数可以做到这一点。
```cpp
cv::GaussianBlur(src, dst, Size(kernelSize, kernelSize), 0);
```
3. **双边滤波**:除了考虑像素距离外,还考虑了像素强度差异,既能平滑图像又能保留边缘细节。`cv::bilateralFilter()`函数用于实现双边滤波。
```cpp
cv::bilateralFilter(src, dst, d, sigmaColor, sigmaSpace);
```
其中d是半径,sigmaColor和sigmaSpace分别是颜色空间和空间域的标准偏差。
相关问题
opencv DCT低通滤波 C++
以下是使用OpenCV和C++进行DCT低通滤波的示例代码:
```cpp
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat image = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
// 将图像转换为浮点型
cv::Mat image_float;
image.convertTo(image_float, CV_32F);
// 执行DCT变换
cv::dct(image_float, image_float);
// 设置低通滤波器
int cutoff_frequency = 10; // 截止频率
int rows = image_float.rows;
int cols = image_float.cols;
int cx = cols / 2;
int cy = rows / 2;
// 应用低通滤波器
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (std::sqrt((i - cy) * (i - cy) + (j - cx) * (j - cx)) > cutoff_frequency) {
image_float.at<float>(i, j) = 0;
}
}
}
// 执行IDCT逆变换
cv::idct(image_float, image_float);
// 将图像转换回8位无符号整型
cv::Mat result;
image_float.convertTo(result, CV_8U);
// 显示结果图像
cv::imshow("Filtered Image", result);
cv::waitKey(0);
return 0;
}
```
请注意,上述代码假设输入图像为灰度图像,并将其保存为名为"input.jpg"的文件。你可以根据需要修改文件名和路径。
opencv图像中频域滤波去除噪声,使用c++代码
以下是使用C语言和OpenCV库实现频域滤波去除噪声的示例代码:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 读取图像
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "读取图像失败!" << endl;
return -1;
}
// 添加高斯噪声
Mat noisyImg;
GaussianBlur(img, noisyImg, Size(7, 7), 10);
imwrite("noisyImage.jpg", noisyImg);
// 傅里叶变换
Mat planes[] = { Mat_<float>(noisyImg), Mat::zeros(noisyImg.size(), CV_32F) };
Mat complexImg;
merge(planes, 2, complexImg);
dft(complexImg, complexImg);
// 显示频谱图
Mat magImg;
magnitude(planes[0], planes[1], magImg);
magImg += Scalar::all(1);
log(magImg, magImg);
normalize(magImg, magImg, 0, 1, NORM_MINMAX);
imshow("频谱图", magImg);
// 生成滤波器
Mat filter = Mat::zeros(noisyImg.size(), CV_32F);
int cx = noisyImg.cols / 2;
int cy = noisyImg.rows / 2;
for (int i = 0; i < noisyImg.rows; i++)
{
for (int j = 0; j < noisyImg.cols; j++)
{
float d = sqrt(pow(i - cy, 2) + pow(j - cx, 2));
if (d < 30)
{
filter.at<float>(i, j) = 1;
}
}
}
// 显示滤波器
imshow("滤波器", filter);
// 应用滤波器
Mat filteredImg;
mulSpectrums(complexImg, filter, complexImg, 0);
idft(complexImg, filteredImg, DFT_SCALE | DFT_REAL_OUTPUT);
// 显示去噪后的图像
imshow("去噪后的图像", filteredImg);
waitKey();
return 0;
}
```
以上代码实现了以下功能:
1. 读取图像;
2. 给图像添加高斯噪声;
3. 进行傅里叶变换,并显示频谱图;
4. 生成滤波器;
5. 应用滤波器;
6. 进行反傅里叶变换,得到去噪后的图像;
7. 显示去噪后的图像。
在代码中,我们使用`imread`函数读取图像,使用`GaussianBlur`函数添加高斯噪声。然后,我们将图像转换为频域表示,通过计算距离生成一个低通滤波器,将其应用于频域图像,再进行反傅里叶变换得到去噪后的图像。最后,我们使用`imshow`函数显示频谱图、滤波器和去噪后的图像,并使用`waitKey`函数等待用户按下键盘上的任意键。
注意:这里的代码只适用于灰度图像。如果要处理彩色图像,需要将其转换为YUV或HSV等颜色空间,对亮度通道进行处理,再转换回RGB。
阅读全文