OpenCV (七)滤波

均值滤波:

blur(src, dst, Size(x, y), Point(-1, -1)), 

高斯滤波:

GussianBlur(src, dst, Size(x, y), a, b)  x 和 y 必须是正奇数。a 表示 sigmax, b 表示 sigmay。

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

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src = imread("D:/OpenCVprj/image/test3.jpg");
	if (!src.data) {
		cout << "could not read image" << endl;
	}
	else {
		namedWindow("src", CV_WINDOW_AUTOSIZE);
		imshow("src", src);
	}
	Mat dst;
	//blur(src, dst, Size(7, 7), Point(-1, -1));

	GaussianBlur(src, dst, Size(7, 7), 11, 11);
	namedWindow("dst", CV_WINDOW_AUTOSIZE);
	imshow("dst", dst);
	waitKey(0);
	return 0;

}

  

中值滤波:

把ksize*ksize 中的像素值,取中值,赋值给kernel圈起来的区域中间的像素点

medianBlur(src, dst, 7);

双边滤波:

对于均值滤波,无法避免图片中物体边缘信息的丢失(均值带来的缺点),处理后的图片物体边缘模糊。

对于高斯滤波,可以部分避免边缘丢失的缺点,但不能完全避免,以为没有考虑像素值的不同。

双边滤波,保留图片中物体轮廓不变。

对比结果如下:

很明显高斯双边滤波效果好很多,图片边缘保留很好。

 再通过filter2D(), 对图片进行细节处理,使图片更清晰。

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

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src = imread("D:/OpenCVprj/image/test3.jpg");
	if (!src.data) {
		cout << "could not read image" << endl;
		return -1;
	}
	else {
		namedWindow("src", CV_WINDOW_AUTOSIZE);
		imshow("src", src);
	}
	Mat median_blur;
	Mat mean_blur;
	Mat gaussian_blur;
	Mat bilatera_filter;

	blur(src, mean_blur, Size(7, 7), Point(-1, -1));
	imshow("mean_blur", mean_blur);

	GaussianBlur(src, gaussian_blur, Size(7, 7), 11, 11);
	imshow("gaussian_blur", gaussian_blur);

	medianBlur(src, median_blur, 7);
	imshow("median_blur", median_blur);

	bilateralFilter(src, bilatera_filter, 7, 11, 11);
	imshow("bilatera_filter", bilatera_filter);

	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	Mat output;
	filter2D(bilatera_filter, output, -1, kernel, Point(-1, -1), 0);
	imshow("output", output);

	waitKey(0);
	return 0;

}

  

结果如下:

另一图片显示对比更加明显:

原文地址:https://www.cnblogs.com/haiboxiaobai/p/11228528.html