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;
}
结果如下:

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


浙公网安备 33010602011771号