机器视觉-6 检测原理之预处理(滤波)
OpenCV 中的滤波是一种用于图像处理的常用技术,主要用于去噪、平滑、边缘检测、增强图像特征等操作。滤波的基本思想是通过卷积操作,将图像中每个像素与其周围像素值按照一定的权重关系进行组合,从而获得新的像素值。下面我将详细介绍 OpenCV 中常用的几种滤波方法。
1. 平均滤波 (Averaging Filter)
平均滤波是一种简单的线性滤波方法,通常用于平滑图像,减少图像噪声。它通过对滤波窗口内的所有像素取平均值来替换中心像素值,适合快速平滑处理,但容易模糊图像中的细节和边缘。
代码实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 读取图像
Mat image = imread("image.jpg");
// 检查图像是否成功加载
if (image.empty()) {
return -1;
}
// 使用平均滤波
Mat blurred_image;
blur(image, blurred_image, Size(5, 5)); // Size(5, 5)表示滤波核的大小
// 显示结果
imshow("Original Image", image);
imshow("Average Filter", blurred_image);
waitKey(0);
return 0;
}
主要参数:
Size(5, 5)
:滤波核的大小,数值越大,平滑效果越明显,但图像细节损失越多。blur()
:这是 OpenCV 中用于平均滤波的函数。
2. 高斯滤波 (Gaussian Filter)
高斯滤波是一种权重滤波器,利用高斯函数生成的权重矩阵进行卷积操作。它在去噪的同时,保留了部分图像的边缘信息,因此是去除高斯噪声的常用方法。
代码实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("image.jpg");
if (image.empty()) {
return -1;
}
// 使用高斯滤波
Mat gaussian_blurred;
GaussianBlur(image, gaussian_blurred, Size(5, 5), 1.5); // Size(5, 5)是滤波核大小, 1.5是sigmaX值
imshow("Original Image", image);
imshow("Gaussian Filter", gaussian_blurred);
waitKey(0);
return 0;
}
主要参数:
Size(5, 5)
:高斯核的大小。sigmaX
:高斯核的标准差,影响平滑程度,值越大平滑效果越强。GaussianBlur()
:高斯滤波函数。
3. 中值滤波 (Median Filter)
中值滤波是一种非线性滤波方法,通常用于去除图像中的椒盐噪声。它通过对滤波窗口中的像素值排序,选取中间值作为中心像素的新的像素值,可以很好地保护图像的边缘。
代码实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("image.jpg");
if (image.empty()) {
return -1;
}
// 使用中值滤波
Mat median_blurred;
medianBlur(image, median_blurred, 5); // 5是滤波核的大小(必须是奇数)
imshow("Original Image", image);
imshow("Median Filter", median_blurred);
waitKey(0);
return 0;
}
主要参数:
5
:中值滤波的核大小,必须是奇数。medianBlur()
:OpenCV 中用于中值滤波的函数。
4. 双边滤波 (Bilateral Filter)
双边滤波是一种可以同时平滑图像并保留边缘细节的滤波器。它通过考虑空间距离和像素值差异来加权邻域像素,因此在平滑区域内部噪声的同时,能有效地保留边缘。
代码实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("image.jpg");
if (image.empty()) {
return -1;
}
// 使用双边滤波
Mat bilateral_filtered;
bilateralFilter(image, bilateral_filtered, 9, 75, 75); // d是邻域直径, sigmaColor和sigmaSpace控制平滑程度
imshow("Original Image", image);
imshow("Bilateral Filter", bilateral_filtered);
waitKey(0);
return 0;
}
主要参数:
d
:表示滤波时使用的邻域直径,如果为负值则根据sigmaSpace
自动计算。sigmaColor
:控制颜色差异的权重,值越大可以使更多的颜色相似像素被平滑。sigmaSpace
:控制空间距离的权重,值越大可以使较远的像素影响滤波结果。bilateralFilter()
:双边滤波函数。
5. 自定义滤波 (Custom Filtering)
通过自定义卷积核,可以实现各种特定的滤波操作。OpenCV 提供了 filter2D()
函数,可以用来对图像应用自定义的卷积核,比如图像锐化、边缘检测等。
代码实现:
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("image.jpg");
if (image.empty()) {
return -1;
}
// 定义一个锐化卷积核
Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0,
-1, 5, -1,
0, -1, 0);
// 使用自定义卷积核进行滤波
Mat sharpened_image;
filter2D(image, sharpened_image, -1, kernel);
imshow("Original Image", image);
imshow("Sharpened Image", sharpened_image);
waitKey(0);
return 0;
}
主要参数:
kernel
:自定义卷积核,这里是一个 3x3 的锐化滤波核。filter2D()
:OpenCV 中进行自定义卷积操作的函数。
总结
- 平均滤波:适用于简单的去噪和平滑操作,但容易模糊边缘。
- 高斯滤波:通过高斯权重平滑图像,适合处理高斯噪声。
- 中值滤波:能有效去除椒盐噪声,且不会明显模糊边缘。
- 双边滤波:在平滑的同时能保持边缘细节,适合细节丰富的图像。
- 自定义滤波:通过自定义卷积核,可以灵活实现各种滤波效果,如锐化、边缘检测等。
每种滤波器都有其特定的用途,实际应用中可以根据图像的特性选择合适的滤波器,也可以组合使用来获得最佳效果。
原文地址:https://blog.csdn.net/dingkm666/article/details/141992351
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!