C++在图像处理中三种常见滤波算法的实现

2024-12-30 19:56:14   小编

C++在图像处理中三种常见滤波算法的实现

在图像处理领域,滤波算法是一种重要的技术手段,用于去除图像中的噪声、平滑图像、增强边缘等。本文将介绍 C++中三种常见的滤波算法及其实现。

一、均值滤波

均值滤波是一种简单的线性滤波算法,它通过计算邻域内像素的平均值来替换中心像素的值。这种算法可以有效地去除图像中的椒盐噪声,但会使图像变得模糊。

以下是使用 C++实现均值滤波的示例代码:

#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat meanFilter(cv::Mat image, int kernelSize) {
    cv::Mat filteredImage = image.clone();
    int halfSize = kernelSize / 2;

    for (int i = halfSize; i < image.rows - halfSize; i++) {
        for (int j = halfSize; j < image.cols - halfSize; j++) {
            int sum = 0;
            for (int m = -halfSize; m <= halfSize; m++) {
                for (int n = -halfSize; n <= halfSize; n++) {
                    sum += image.at<uchar>(i + m, j + n);
                }
            }
            filteredImage.at<uchar>(i, j) = sum / (kernelSize * kernelSize);
        }
    }

    return filteredImage;
}

int main() {
    cv::Mat image = cv::imread("image.jpg", 0);
    cv::Mat filteredImage = meanFilter(image, 3);
    cv::imshow("Original Image", image);
    cv::imshow("Filtered Image", filteredImage);
    cv::waitKey(0);
    return 0;
}

二、中值滤波

中值滤波是一种非线性滤波算法,它将邻域内像素的值进行排序,然后用中间值替换中心像素的值。中值滤波对椒盐噪声有很好的去除效果,并且能较好地保留图像的边缘信息。

以下是中值滤波的 C++实现代码:

#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat medianFilter(cv::Mat image, int kernelSize) {
    cv::Mat filteredImage = image.clone();
    int halfSize = kernelSize / 2;

    for (int i = halfSize; i < image.rows - halfSize; i++) {
        for (int j = halfSize; j < image.cols - halfSize; j++) {
            std::vector<int> values;
            for (int m = -halfSize; m <= halfSize; m++) {
                for (int n = -halfSize; n <= halfSize; n++) {
                    values.push_back(image.at<uchar>(i + m, j + n));
                }
            }
            std::sort(values.begin(), values.end());
            filteredImage.at<uchar>(i, j) = values[values.size() / 2];
        }
    }

    return filteredImage;
}

三、高斯滤波

高斯滤波是一种基于高斯函数的平滑滤波算法,它对图像进行加权平均,权重与像素距离中心的远近有关。高斯滤波在去除噪声的能较好地保留图像的细节信息。

以下是高斯滤波的 C++实现:

#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat gaussianFilter(cv::Mat image, double sigma, int kernelSize) {
    cv::Mat filteredImage = image.clone();
    int halfSize = kernelSize / 2;

    cv::Mat kernel = cv::getGaussianKernel(kernelSize, sigma);

    for (int i = halfSize; i < image.rows - halfSize; i++) {
        for (int j = halfSize; j < image.cols - halfSize; j++) {
            double sum = 0.0;
            for (int m = -halfSize; m <= halfSize; m++) {
                for (int n = -halfSize; n <= halfSize; n++) {
                    sum += image.at<uchar>(i + m, j + n) * kernel.at<double>(m + halfSize, n + halfSize);
                }
            }
            filteredImage.at<uchar>(i, j) = sum;
        }
    }

    return filteredImage;
}

这三种滤波算法在图像处理中都有广泛的应用,根据不同的需求选择合适的滤波算法可以有效地提高图像处理的效果。在实际应用中,还可以结合其他图像处理技术,如边缘检测、图像分割等,以获得更好的图像处理结果。

TAGS: C++编程实现 C++图像处理 常见滤波算法 图像处理应用

欢迎使用万千站长工具!

Welcome to www.zzTool.com