zoukankan      html  css  js  c++  java
  • opencv的学习笔记4

      通常更加高级的形态学变换,如开闭运算、形态学梯度、“顶帽”、“黑帽”等等,都是可以由常用的腐蚀膨胀技术结合来达到想要的效果。

    1.开运算:先腐蚀后膨胀,用于用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积,就是使图片过度更为顺畅,填补小的空隙。

    2.闭运算:先膨胀后腐蚀,能够排除小型黑洞(黑色区域),就是不让图片有细小分支向外伸出。

    3.形态学梯度(Morphological Gradient):

    膨胀图与腐蚀图之差,数学表达式如下:

    二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓

    4.顶帽(Top Hat):

    顶帽运算(Top Hat)又常常被译为”礼帽“运算。为原图像与上文刚刚介绍的“开运算“的结果图之差,数学表达式如下:

    顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

    5.黑帽(Black Hat):

    黑帽(Black Hat)运算为”闭运算“的结果图与原图像之差。数学表达式为:

    黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。

    所以,黑帽运算用来分离比邻近点暗一些的斑块。

    6.API函数实现:

    void  morphologyEx(  InputArray src,  OutputArray dst,  int op,    InputArraykernel,  Pointanchor=Point(-1,-1),   intiterations=1,  intborderType=BORDER_CONSTANT,    constScalar& borderValue=morphologyDefaultBorderValue() );  

    • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
    • 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
    • 第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
      • MORPH_OPEN – 开运算(Opening operation)
      • MORPH_CLOSE – 闭运算(Closing operation)
      • MORPH_GRADIENT -形态学梯度(Morphological gradient)
      • MORPH_TOPHAT - “顶帽”(“Top hat”)
      • MORPH_BLACKHAT - “黑帽”(“Black hat“)

    另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。

    • 第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement我们上篇文章中讲过了,这里为了大家参阅方便,再写一遍:

    其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:

      • 矩形: MORPH_RECT
      • 交叉形: MORPH_CROSS
      • 椭圆形: MORPH_ELLIPSE
    • 第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
    • 第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
    • 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
    • 第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

    这里看的乱七八糟,这是原贴:http://blog.csdn.net/poem_qianmo/article/details/24599073

  • 相关阅读:
    搜索进阶1、八数码(HDU1043)
    D.迷宫2 (BFS+优先队列)
    小H的询问(线段树)
    B.迷宫(BFS)
    【UVA】10935 Throwing cards away I(STL队列)
    【UVA】10391 Compound Words(STL map)
    【UVA】12100 Printer Queue(STL队列&优先队列)
    【UVA】1596 Bug Hunt(模拟)
    【UVA】201 Squares(模拟)
    【UVA】1595 Symmetry(模拟)
  • 原文地址:https://www.cnblogs.com/soulmate1023/p/5610024.html
Copyright © 2011-2022 走看看