holyya.com
2025-09-04 21:42:30 Thursday
登录
文章检索 我的文章 写文章
C++实现图像处理中的中值滤波
2023-06-29 02:36:40 深夜i     --     --
C++ 图像处理 中值滤波

图像处理是计算机视觉、数字图像处理和计算机图形学等领域中广泛使用的一种技术。在图像处理中,中值滤波是一个常用的滤波方法。中值滤波可以有效地去除图像中的椒盐噪声、斑点和其他类型的噪声。

中值滤波是一种非线性滤波方法,它通过对像素值进行排序来获得中值,并用中值来代替原来的像素值。中值滤波的处理过程是对于每一个像素,取其周围区域的像素值进行排序,然后选取其中位数作为该像素的新值。

在C++中实现中值滤波比较简单,可以使用STL中的nth_element函数。首先定义一个窗口大小,例如3x3的窗口大小,然后遍历整张图像,选取当前像素周围的窗口进行排序,选取中间的像素值作为该像素的新值。

下面是一个简单的C++代码实现中值滤波:


#include <iostream>

#include <algorithm>

#include <vector>

#include <opencv2/opencv.hpp>

using namespace std;

using namespace cv;

int main(int argc, char* argv[])

{

  Mat src, dst;

  src = imread(argv[1], IMREAD_COLOR);

  if (src.empty())

  

    return -1;

  

  int kernel_size = 3; // 定义窗口大小

  int border_size = kernel_size / 2; // 计算边界大小

  dst.create(src.size(), src.type());

  vector<int> window(kernel_size * kernel_size); // 定义一个一维向量,存放窗口像素值

  for (int y = border_size; y < src.rows - border_size; y++)

  {

    for (int x = border_size; x < src.cols - border_size; x++)

    {

      int i = 0;

      for (int yy = y - border_size; yy <= y + border_size; yy++)

      {

        for (int xx = x - border_size; xx <= x + border_size; xx++)

        {

          window[i++] = src.at<Vec3b>(yy, xx)[0]; // 将窗口像素值存入向量中

        }

      }

      nth_element(window.begin(), window.begin() + window.size() / 2, window.end()); // 使用nth_element函数来获得中值

      dst.at<Vec3b>(y, x)[0] = window[window.size() / 2]; // 将中值作为新像素值存入目标图像

      dst.at<Vec3b>(y, x)[1] = window[window.size() / 2];

      dst.at<Vec3b>(y, x)[2] = window[window.size() / 2];

    }

  }

  imshow("src", src);

  imshow("dst", dst);

  waitKey();

  return 0;

}

在实际应用中,窗口大小、边界大小以及像素值的类型都可以根据需求进行修改。中值滤波不仅仅可以去除图像噪声,还可以用于图像边缘提取、纹理分析等领域。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复