zoukankan      html  css  js  c++  java
  • OpenCV3入门(七)图像形态学

    1、膨胀

    所谓的图片的膨胀处理,其实就是在图像的边缘添加像素值,使得整体的像素值扩张,进而达到图像的膨胀效果。

    对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作:

    A⊕S={z|(S)z ∩ A ≠ Ø}

    让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S与A有公共的交集(非空集),则认为这样的z点构成的集合是S对A的膨胀图像。

    函数原型:

    CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                              Point anchor = Point(-1,-1), int iterations = 1,
                              int borderType = BORDER_CONSTANT,
                              const Scalar& borderValue = morphologyDefaultBorderValue() );

    dst表示处理的结果

    src表示原图像

    kernel表示卷积核

    anchor是point类型,表示锚的位置,默认正中心

    iterations表示迭代次数

    borderType边缘的模糊方式

    一般需要前三个参数即可,第三个参数需要用getStructuringElement函数确定,该函数确定模板内核特性和锚点的位置。

    CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

    模板内核的类型有:

    MORPH_RECT:矩形

    MORPH_CROSS:交叉型

    MORPH_ELLIPSE:椭圆型

    示例如下。

    img = imread("D:\WORK\5.OpenCV\LeanOpenCV\pic_src\pic7.bmp");
    
    img1 = img.clone();
    imshow("原图", img);
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
    dilate(img, img2, element);
    imshow("膨胀", img2); 

    2、腐蚀

    腐蚀:就是求局部最小值的操作。

    结构元素(Sturcture Element),形象称呼刷子,在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。

    对Z2上元素集合A和结构体元素S,使用S对A进行腐蚀,记作:

    AΘS={z|(S)z € A}

    让位于图像圆点的结构元素S在Z平面上移动,如果S的圆点移动到z点时,S能够完全的包含于A中,则认为这样的z点构成的集合是S对A的腐蚀图像。

    函数原型:

    CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                             Point anchor = Point(-1,-1), int iterations = 1,
                             int borderType = BORDER_CONSTANT,
                             const Scalar& borderValue = morphologyDefaultBorderValue() );

    示例如下。

    img = imread("D:\WORK\5.OpenCV\LeanOpenCV\pic_src\pic7.bmp");
    
    img1 = img.clone();
    imshow("原图", img);
    Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
    erode(img, img2, element);
    imshow("腐蚀", img2);

    3、开运算和闭运算

    1)开运算就是先腐蚀后膨胀的过程,可以表示为:

    dst = open(src, element)

    dst = dilate(erode(dst, element))

    作用:用来消除小的物体,平滑形状边界,并且不改变其面积。可以去除小颗粒噪声,断开物体之间的粘连。

    2)闭运算是先膨胀后腐蚀的过程,可以表示为:

    dst = close(src, element)

    dst = erode(dilate (dst, element))

    作用:用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。

    函数原型:

    CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                    int op, InputArray kernel,
                                    Point anchor = Point(-1,-1), int iterations = 1,
                                    int borderType = BORDER_CONSTANT,
                                    const Scalar& borderValue = morphologyDefaultBorderValue() );

    其中第三个参数op代表形态学运算的类型,具体如下表。

    img = imread("D:\WORK\5.OpenCV\LeanOpenCV\pic_src\pic7.bmp");
    
    img1 = img.clone();
    imshow("原图", img);
    Mat element = getStructuringElement(MORPH_RECT, Size(7, 7));
    morphologyEx(img, img2, MORPH_OPEN, element);
    imshow("开运算", img2);
    morphologyEx(img, img3, MORPH_CLOSE, element);
    imshow("闭运算", img3);

    内核模板大小为Size(3,3)时测试如下图,开运算因为先做了腐蚀所以图片上的小白点都消失了。而闭运算因为先膨胀,所以小白点被放大了,再次腐蚀后也留了下来,并且有多个小白点连在了一起。此外闭运算图中细菌出现了互相连接的边缘,开运算细菌边缘间隔更加清晰。

    内核模板大小为Size(7,7)时测试如下。

    4、形态学梯度

    形态学梯度就是膨胀图与腐蚀图之差,梯度从原区域的膨胀中减去了原区域的收缩,保留了图像的外边缘部分,也就是图像的轮廓。

    可以表示为:

    dst = morpd_grad(src, element) = dilate (src, element) - erode(src, element)

    5、顶帽和黑帽

    1)顶帽(Top Hat):

    又称“礼帽”运算,原图像与开运算图的差,突出原图像中比周围亮的区域。

    因为开运算放大了裂缝或者局部低亮度的区域,再从原图中减去开运算后的图,就保留了比原图轮廓周围的区域更明亮的区域。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

    2)黑帽(Black Hat):

    闭操作图像减去原图像,突出原图像中比周围暗的区域。

    黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,此外黑帽还能得到图像内部的小孔,或者前景色中的小黑点。

    6、高斯金字塔

    图像金字塔是图像中多尺度表达的一种,最初用于机器视觉和图像压缩,金字塔的底部是高分辨率的图像,而顶部是低分辨率的近似,当向金字塔的上层移动时,尺寸和分辨率降低,伴随的细节就越少。低分辨率的图像主要用于分析大的结构或图像的整体内容,高分辨率图像适合分析单个物体的特性。

    1)下采样:就是图片缩小,使用PryDown函数,先高斯模糊,再降采样。下采样将步骤:先对图像进行高斯内核卷积,再将所有偶数行和列去除,图像缩小到原来四分之一,迭代上述步骤就得到的金字塔。

    2)上采样:就是图片放大,使用PryUp函数。先将图像在每个方向扩大为原来的两倍,新增的行和列以0填充,再卷积得到放大后的图像。

    函数原型为:

    CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
                             const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
    CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
                              const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );

    示例如下。

    img = imread("D:\WORK\5.OpenCV\LeanOpenCV\pic_src\pic5.bmp");
    imshow("原图", img);
    pyrDown(img, img2, Size(img.cols * 2, img.rows * 2));
    imshow("上采样运算1", img2);
    pyrDown(img2, img3, Size(img2.cols * 2, img2.rows * 2));
    imshow("上采样运算2", img3);

    上采样结果。

    下采样结果。

    7、参考文献

    1、《OpenCV3 编程入门》,电子工业出版社,毛星雨著

    2、《学习OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著

    3、图像金字塔(高斯金字塔、拉普拉斯金字塔)

    https://www.cnblogs.com/sddai/p/10330756.html

    4、图像金字塔

    https://www.kancloud.cn/aollo/aolloopencv/272073

    5、Image Pyramids

    https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_pyramids/py_pyramids.html

    6、Image Pyramids

    https://docs.opencv.org/2.4/doc/tutorials/imgproc/pyramids/pyramids.html

     尊重原创技术文章,转载请注明。

    https://www.cnblogs.com/pingwen/p/12319629.html

  • 相关阅读:
    Tomcat配置和Spring MVC配置
    Servlet学习总结
    Servlet 工作原理
    Spring MVC
    Spring的线程安全
    Struts的线程安全
    反射实现AOP动态代理
    Spring AOP的实现原理
    JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
    Spring bean初始化以及管理
  • 原文地址:https://www.cnblogs.com/pingwen/p/12319629.html
Copyright © 2011-2022 走看看