21xrx.com
2025-03-31 12:47:26 Monday
文章检索 我的文章 写文章
C++实现图像处理中的中值滤波
2023-06-29 02:36:40 深夜i     6     0
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;
}

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

  
  

评论区