zoukankan      html  css  js  c++  java
  • 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;
    
    }
    

      

    结果如下:

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

  • 相关阅读:
    Django之model补充:一对多、跨表操作
    Ajax
    Django之model详解
    Django补充之模板语言
    Django基础篇
    web框架
    linux下命令学习
    make: Warning: File `Makefile' has modification time 17 s in the future
    linux下复制文件报cp: omitting directory `XXX'
    关于控制台程序下使用mfc库中的函数时断言
  • 原文地址:https://www.cnblogs.com/haiboxiaobai/p/11228528.html
Copyright © 2011-2022 走看看