自学内容网 自学内容网

机器视觉-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)!