C++实现中值滤波的示例代码

  void medianFilter(cv::Mat& src, cv::Mat& dst, cv::Size width)

  {

  //判断窗口是否为奇数

  if (width.width % 2 == 0 || width.height % 2 == 0)

  {

  std::cout << "输入窗口大小应该为奇数,请重新输入" << endl;

  exit(-1);

  }

  else

  {

  //计算边界扩充长度

  int h = (width.height - 1) / 2;

  int w = (width.width - 1) / 2;

  //对原图边界扩充

  cv::Mat src_border;

  cv::copyMakeBorder(src, src_border, h, h, w, w, cv::BORDER_REFLECT_101);

  for (int i = h; i < src.rows + h; i++)

  {

  for (int j = w; j < src.cols + w; j++)

  {

  //定义容器存放窗口对应的像素

  std::vector v;

  for (int ii = i - h; ii <= i + h; ii++)

  {

  for (int jj = j - w; jj <= j + w; jj++)

  {

  v.push_back(src_border.at(ii, jj));

  }

  }

  //对容器内存放的像素排序

  int len = width.area();

  bubble(v, len);

  //将中值赋给目标图像对应位置

  dst.at(i-h, j-w) = v[(len - 1) / 2];

  }

  }

  }

  }