21xrx.com
2025-03-30 11:37:44 Sunday
文章检索 我的文章 写文章
C++实现图像均值滤波
2023-06-27 13:30:00 深夜i     19     0
C++ 图像 均值滤波 图形处理 算法

图像均值滤波是一种常用的图像处理技术,可以有效去除图像中的噪点。本文将介绍如何使用C++语言实现图像均值滤波。

首先,我们需要明确什么是图像均值滤波。均值滤波主要是通过对图像中每个像素周围一定范围内的像素值进行平均,以达到平滑图像的效果。均值滤波的公式如下:

![](https://img-blog.csdn.net/20150809163844294)

公式中,I(x,y)表示输入图像中坐标为(x,y)的像素值,m和n分别表示均值滤波的模板大小,k表示模板的大小。具体实现时,通常采用3x3的模板。

接下来,我们来看C++代码实现:

Mat mean_filter(Mat& srcImage) {
  Mat dstImage = srcImage.clone(); // 克隆原图像
  int kSize = 3// 模板大小
  int channels = dstImage.channels(); // 获取图像通道数
  for (int row = kSize / 2; row < srcImage.rows - kSize / 2; row++) {
    uchar* current = dstImage.ptr<uchar>(row); // 获取当前行指针
    for (int col = kSize / 2; col < srcImage.cols - kSize / 2; col++) {
      for (int i = 0; i < channels; i++) {
        int sum = 0// 像素值之和
        // 以当前点为中心点,对3x3区域内的像素进行求和
        for (int m = -kSize / 2; m <= kSize / 2; m++) {
          uchar* temp = dstImage.ptr<uchar>(row + m);
          for (int n = -kSize / 2; n <= kSize / 2; n++) {
            sum += *(temp + (col + n) * channels + i);
          }
        }
        // 将求和结果赋值给当前像素
        *(current + col * channels + i) = sum / (kSize * kSize);
      }
    }
  }
  return dstImage; // 返回均值滤波后的图像
}

上述代码中,我们使用了OpenCV库加载图像,通过计算中心像素周围3x3的区域内像素值之和并求平均值,将结果赋值给中心像素,最后返回均值滤波的图像。

最后,我们可以通过以下代码来测试实现的图像均值滤波:

int main() {
  // 加载图像
  Mat srcImage = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
  // 读取图像失败
  if (srcImage.empty())
    cout << "读取图像失败!" << endl;
    return -1;
  
  // 图像均值滤波
  Mat dstImage = mean_filter(srcImage);
  // 显示原图和均值滤波后的图像
  imshow("原图", srcImage);
  imshow("均值滤波", dstImage);
  // 等待输入
  waitKey(0);
  return 0;
}

运行结果如下:

![](https://img-blog.csdn.net/20150809165147995)

通过以上代码,我们成功使用C++语言实现了图像均值滤波。图像均值滤波是图像处理中常用的技术之一,对去除图像中的噪点和平滑图像具有一定的效果。

  
  

评论区