均值滤波:
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; }
结果如下:
另一图片显示对比更加明显: