本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:denoising

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

using namespace cv;
using namespace std;

int main(int argc, const char** argv) {
	Mat src = imread("../sample/sp_noise.png");
	if (src.empty()) {
		cout << "could not load image..." << endl;
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	// 均值滤波
	Mat dst;
	blur(src, dst, Size(5, 5));
	imshow("mean denoise demo", dst);

	// 中值滤波
	medianBlur(src, dst, 5);
	imshow("median denoise demo", dst);

	// 高斯滤波
	GaussianBlur(src, dst, Size(5, 5), 0);
	imshow("gaussian denoise demo", dst);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

去噪常用的方式是使用滤波。

  • 均值滤波速度快。对高斯噪声表现较好,对椒盐噪声表现较差
  • 中值滤波对椒盐噪声表现好,对高斯噪声表现较差
opencv4入门笔记(22):图像去噪-萤火
均值滤波和中值滤波的比较

blur:均值滤波

void blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT );
  • src:输入图像,可以为任意通道,当进行滤波时,各通道的处理是独立的。但是深度只能为CV_8U, CV_16U, CV_16S, CV_32F或CV_64F
  • dst:输出图像,与src具有相同的尺寸和类型
  • ksize:卷积核尺寸
  • anchor:锚点,将卷积结果赋值给哪个位置的像素。(-1, -1)代表卷积核中心位置
  • borderType:图像边缘处理方式。注意是在卷积之前进行填充

medianBlur:中指滤波

void medianBlur( InputArray src, OutputArray dst, int ksize );
  • src:输入图像,1或3或4通道。当ksize为3或5时,图像深度应该为CV_8U, CV_16U, 或 CV_32F。对于更大的ksize,只能为CV_8U
  • dst:输出图像,与src具有相同的尺寸和类型
  • ksize:卷积核尺寸,必须为大于1的奇数

GaussianBlur:高斯模糊。使用高斯滤波器进行滤波

void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );
  • src:输入图像,可以为任意通道,当进行滤波时,各通道的处理是独立的。但是深度只能为CV_8U, CV_16U, CV_16S, CV_32F或CV_64F
  • dst:输出图像,与src具有相同的尺寸和类型
  • ksize:卷积核尺寸
    • 宽度和高度可以不一致,但必须为正的奇数或0
    • 当为0时,此时将通过sigma来自动计算
  • sigmaX:X方向的高斯核标准偏差
  • sigmaY:Y方向的高斯核标准偏差。如果sigmaY为0,那么它将会等于sigmaX;如果它们都等于0,将会通过ksize来自动计算
  • borderType:图像边缘处理方式