zoukankan      html  css  js  c++  java
  • Opencv的使用小教程2——Opencv常用图像处理函数汇总

        1、blur
         2、GaussianBlur
         3、medianBlur
         4、bilateralFilter
         5、腐蚀和膨胀
         6、morphologyEx高级形态学变换
         7、convertScaleAbs图像增强
         8、Sobel
         9、Laplacian
         10、Scharr
         11、Canny

    好好学习噢!
    在这里插入图片描述
    该部分主要提到的函数包括各种滤波、膨胀、腐蚀、开运算、闭运算等。
    本次博文将以Lena图作为使用例子进行演示。

    在这里插入图片描述

    1、blur

    blur用于图像的均值滤波,调用方式如下:

    blur(src, dst, Size(3, 3));
    

    其中,src为源图,dst为目标图,Size(3, 3)表示每个滤波器窗口的大小。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src);
    	Mat dst;
    	blur(src, dst, Size(3, 3));
    	imshow("blur", dst);
    	imwrite("after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:

    在这里插入图片描述

    2、GaussianBlur

    GaussianBlur用于图像的高斯滤波,调用方式如下:

    GaussianBlur(src, dst, Size(5, 5), 3, 3);
    

    其中,src为源图,dst为目标图,Size(5, 5)表示每个滤波器窗口的大小。两个3分别代表X方向和Y方向的标准差。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src);
    	Mat dst;
    	GaussianBlur(src, dst, Size(5, 5), 3, 3);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:

    在这里插入图片描述

    3、medianBlur

    medianBlur用于图像的中值滤波,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法对于脉冲噪声、椒盐噪声效果良好。调用方式如下:

    medianBlur(src, dst, ksize);
    

    其中,src为源图,dst为目标图,ksize是滤波模板的尺寸大小,必须是大于1的奇数。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src);
    	Mat dst;
    	int ksize = 5;
    	medianBlur(src, dst, ksize);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:

    在这里插入图片描述

    4、bilateralFilter

    bilateralFilter用于图像的双边滤波,双边滤波器可以很好的边缘保护,即可以在去噪的同时,保护图像的边缘特性,调用方式如下:

    bilateralFilter(src, dst, d, sigmaColor, sigmaSpace);
    

    其中:
    src为源图;
    dst为目标图;
    d为过滤过程中每个像素邻域的直径范围;
    double sigmaColor:颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
    double sigmaSpace:坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src); 
    	Mat dst;
    	int d = 50;
    	int sigmaColor = 50;
    	int sigmaSpace = 50;
    	bilateralFilter(src, dst, d, sigmaColor, sigmaSpace);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为(磨皮了):
    在这里插入图片描述

    5、腐蚀和膨胀

    膨胀与腐蚀是相对于亮部分而言的,不是暗部分。
    膨胀就是图像中的高亮部分进行膨胀,效果图拥有比原图更大的亮区域。
    腐蚀就是原图中的高亮部分被腐蚀,效果图拥有比原图更小的亮区域。
    调用方式如下:

    // 膨胀
    dilate(src, dst, erodeStruct);
    // 腐蚀
    erode(src, dst, erodeStruct);
    

    其中,src为源图,dst为目标图,erodeStruct是用于膨胀操作和腐蚀操作的结构元素,越大则膨胀与腐蚀的效果越明显。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src); 
    	Mat dst;
    	Mat erodeStruct = getStructuringElement(MORPH_RECT, Size(5, 5));
    	erode(src, dst, erodeStruct);
    	//dilate(src, dst, erodeStruct);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用效果如下:(第一张为膨胀,第二张为腐蚀)
    在这里插入图片描述

    在这里插入图片描述

    6、morphologyEx高级形态学变换

    morphologyEx用于完成高级形态学变换,所谓高级形态学变换相当于一些比较简单的形态学变换的结合。
    常见的高级形态学变换方式如下:
    1、开运算:腐蚀->膨胀,其主要作用为去除图像中较小区域
    2、闭运算:膨胀->腐蚀,可以去除掉小型黑洞
    3、顶帽:原图-开运算,用于突出比原图轮廓周围的区域更明亮的区域,用来分离比临近点亮一些的斑块
    4、黑帽:闭运算-原图,用于突出比原图轮廓周围的区域更暗的区域,用来分离比临近点暗一些的斑块
    5、形态学梯度:膨胀-腐蚀,对二值图操作可以将团块的边缘突出,用来保留物体的边缘轮廓。
    调用方式如下:

    // 以形态学梯度为例,调用方式如下
    morphologyEx(src, dst, MORPH_GRADIENT,erodeStruct);
    

    其中,src为源图,dst为目标图,erodeStruct是结构元素,越大则处理的效果越明显,第三个参数为表示使用的高级形态学变换是什么,可选择的参数如下:
    MORPH_OPEN 开运算
    MORPH_CLOSE 闭运算
    MORPH_GRADIENT 形态学梯度
    MORPH_TOPHAT 顶帽
    MORPH_BLACKHAT 黑帽
    MORPH_ERODE 腐蚀
    MORPH_DILATE 膨胀
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src); 
    	Mat dst;
    	Mat erodeStruct = getStructuringElement(MORPH_RECT, Size(3, 3));
    	morphologyEx(src, dst, MORPH_GRADIENT,erodeStruct);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用效果如下:
    在这里插入图片描述

    7、convertScaleAbs图像增强

    convertScaleAbs可以用于快速的图像增强,可以为图片中的每个点进行线性运算。
    调用方式如下:

    convertScaleAbs(src, dst, theta, b);
    

    其中,src为源图,dst为目标图,图片中所有点的值都会*theta+b。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src); 
    	Mat dst;
    	double theta = 1.5;
    	double b = 10;
    	convertScaleAbs(src, dst, theta, b);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:
    在这里插入图片描述

    8、Sobel

    Sobel算子是像素图像边缘检测中最重要的算子之一,具有非常重要的作用。
    调用方式如下:

    Sobel(src,dst,CV_16U, 1, 1, 5);
    

    其中,src为源图,dst为目标图
    第三个参数为输出图像的深度,可选参数为:CV_8U,CV_16U,CV_16S,CV_32F,CV_64F,其选择结果根据输入图像决定,在不确定的情况下可以使用-1。
    第四个和第五个参数可以取0或者1,代表x方向和y方向上的差分阶数,0代表该方向不取。
    第六个参数为ksize的大小,表示sobel器的大小。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src); 
    	Mat dst;
    	cvtColor(src, src, COLOR_RGB2GRAY);
    	GaussianBlur(src, src, Size(3, 3),0.5, 0.5);
    	Sobel(src, dst, CV_16U, 1, 1, 5);
    	convertScaleAbs(dst, dst);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:
    在这里插入图片描述

    9、Laplacian

    Laplacian算子是像素图像边缘检测中最重要的算子之一,具有非常重要的作用。
    调用方式如下:

    Laplacian(src, dst, CV_16U, 3);
    

    其中,src为源图,dst为目标图
    第三个参数为输出图像的深度,可选参数为:CV_8U,CV_16U,CV_16S,CV_32F,CV_64F,其选择结果根据输入图像决定,在不确定的情况下可以使用-1。
    第四个参数为ksize的大小,表示Laplacian器的大小。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src); 
    	Mat dst;
    	cvtColor(src, src, COLOR_RGB2GRAY);
    	GaussianBlur(src, src, Size(3, 3),1, 1);
    	Laplacian(src, dst, CV_16U, 3);
    	convertScaleAbs(dst, dst);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:
    在这里插入图片描述

    10、Scharr

    Scharr算子也是一种常见的边缘检测算子,与sobel的参数类似,但是仅作用于大小为3的内核,同时。
    调用方式如下:

    Scharr(src, dst, CV_16U, 1, 0);
    //或者
    Scharr(src, dst, CV_16U, 0, 1);
    

    其中,src为源图,dst为目标图
    第三个参数为输出图像的深度,可选参数为:CV_8U,CV_16U,CV_16S,CV_32F,CV_64F,其选择结果根据输入图像决定,在不确定的情况下可以使用-1。
    第四个和第五个参数可以取0或者1,代表x方向和y方向上的差分阶数,0代表该方向不取。Scharr不可以同时取1。
    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src);
    	Mat dst;
    	cvtColor(src, src, COLOR_RGB2GRAY);
    	GaussianBlur(src, src, Size(3, 3), 0.5, 0.5);
    	Scharr(src, dst, CV_16U, 1, 0);
    	convertScaleAbs(dst, dst);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:
    在这里插入图片描述

    11、Canny

    Canny算法就是首先对图像选择一定的Gauss滤波器进行平滑滤波,然后采用非极值抑制技术进行处理得到最后的边缘图像。
    调用方式如下:

    Canny(src, dst, 50, 150, 3);
    

    其中,src为源图,dst为目标图。
    第三个参数为低阈值,值越大,找到的边缘越少。
    第四个参数为高阈值,值越大,找到的边缘越少。
    第五个参数为Canny算子的大小。

    具体应用方式如下:

    int main() {
    	Mat src = imread("./Lena.jpg");
    	imshow("before", src);
    	Mat dst;
    	cvtColor(src, src, COLOR_RGB2GRAY);
    	GaussianBlur(src, src, Size(3, 3), 0.5, 0.5);
    	Canny(src, dst, 50, 150, 3);
    	convertScaleAbs(dst, dst);
    	imshow("blur", dst);
    	imwrite("./after.jpg", dst);
    	while (waitKey(1) != '1') {}
    }
    

    应用结果为:
    在这里插入图片描述

    天道酬勤 循序渐进 技压群雄
  • 相关阅读:
    react-router-dom中route报错处理 Invalid prop 'component' supplied to 'Route': the prop is not a valid React component
    解决create-react-app在ie中打开页面空白的兼容性问题
    使用Echart VUE实战开发-大数据疫情地图
    深克隆 闭包 面向对象总结
    数组去重 数组排序的方法 js实现
    JAVA常用知识总结(六)——Mybatis
    时间复杂度和空间复杂度
    JAVA常用知识总结(五)——Linux
    JAVA常用知识总结(三)——JAVA虚拟机
    JAVA常用知识总结(二)
  • 原文地址:https://www.cnblogs.com/wuyuan2011woaini/p/15681805.html
Copyright © 2011-2022 走看看