zoukankan      html  css  js  c++  java
  • (转) 开运算opening_circle和闭运算closing_circle的异同

    从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同

    例一:毛刺在往外凸的面上

    策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域。 

    1 read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg')
    2 binary_threshold (Tu, Region, 'max_separability', 'dark', UsedThreshold)
    3 opening_circle (Region, RegionOpening, 50.5)
    4 difference (Region, RegionOpening, RegionDifference)
    5 dev_display (Tu)
    6 dev_display (RegionDifference)

    可以看到,虽然毛刺被分割出来了,但是多出了4块干扰的区域。原因是执行opening_circle时,四个尖角被削平了。

    开运算是先腐蚀再膨胀。腐蚀之后,毛刺被削没了,但是4个尖角大致保持以前的形状;4个尖角再经过膨胀运算后,就变得不尖了。

    策略2:分割出白色部分,然后通过闭运算封闭凹槽,再通过闭运算之后的区域减去原白色部分区域,得到毛刺部分的区域。

    1 read_image (Tu, 'C:/Users/xiahui/Desktop/tu.jpg')
    2 binary_threshold (Tu, Region, 'max_separability', 'light', UsedThreshold)
    3 closing_circle (Region, RegionClosing, 50.5)
    4 difference (RegionClosing, Region, RegionDifference)
    5 dev_display (Tu)
    6 dev_display (RegionDifference)

    分割效果很好。

    例二:毛刺在往内凹的面上

    策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域。

    1 read_image (Ao, 'C:/Users/xiahui/Desktop/ao.jpg')
    2 binary_threshold (Ao, Region, 'max_separability', 'dark', UsedThreshold)
    3 opening_circle (Region, RegionOpening, 50.5)
    4 difference (Region, RegionOpening, RegionDifference)
    5 dev_display (Ao)
    6 dev_display (RegionDifference)

    分割效果不佳,现象和原因同例一。

    策略2:分割出白色部分,然后通过闭运算封闭凹槽,再通过闭运算之后的区域减去原白色部分区域,得到毛刺部分的区域。

    1 read_image (Ao, 'C:/Users/xiahui/Desktop/ao.jpg')
    2 binary_threshold (Ao, Region, 'max_separability', 'light', UsedThreshold)
    3 closing_circle (Region, RegionClosing, 50.5)
    4 difference (RegionClosing, Region, RegionDifference)
    5 dev_display (Ao)
    6 dev_display (RegionDifference)

    分割效果很好。

    说明:

    以上的opening_circle (Region, RegionOpening, 50.5)可以用下面的代码来完全等效:

    set_system ('tsp_clip_region', 'false')
    erosion_circle (Region, RegionErosion1, 50.5)
    dilation_circle (RegionErosion1, RegionDilation, 50.5)

    set_system ('tsp_clip_region', 'false')的意思是当region(一般是膨胀以后)超过图像区域时,不修剪region

    下面我通过一些简单图形来观察开运算(腐蚀—膨胀)和闭运算(膨胀—腐蚀)的执行效果。

    用腐蚀、膨胀算子来模拟开运算的过程:

    复制代码
    1 *模拟开运算
    2 set_system ('tsp_clip_region', 'false')
    3 read_image (Rect, 'C:/Users/xiahui/Desktop/Rect.jpg')
    4 binary_threshold (Rect, Region, 'max_separability', 'dark', UsedThreshold)
    5 erosion_circle (Region, RegionErosion, 30.5)
    6 dilation_circle (RegionErosion, RegionDilation, 30.5)
    7 dev_display (Rect)
    8 dev_display (RegionDilation)
    复制代码

    (这个星花腐蚀和膨胀值要小些,不然没有上图的效果)

    用膨胀、腐蚀算子来模拟闭运算的过程:

    复制代码
    1 *模拟闭运算
    2 set_system ('tsp_clip_region', 'false')
    3 read_image (Rect, 'C:/Users/xiahui/Desktop/rect.jpg')
    4 binary_threshold (Rect, Region, 'max_separability', 'dark', UsedThreshold)
    5 dilation_circle (Region, RegionDilation, 30.5)
    6 erosion_circle (RegionDilation, RegionErosion, 30.5)
    7 dev_display (Rect)
    8 dev_display (RegionErosion)
    复制代码

    (矩形闭运算后可完全复原)

    (正八边形闭运算后可完全复原)

    叠加在一起看看:

    (无法复原)

    结论:

    1、膨胀会使尖角变平滑。
    2、对于凸多边形来说(可用shape_trans (Region, RegionTrans, 'convex')生成凸多边形),腐蚀以后,region的外形特征保持不变,矩形腐蚀以后仍是矩形,三角形腐蚀以后还是三角形。


    3、对于非凸多边形来说,腐蚀以后,region的外形特征大致保持不变,但是如果region的尖角特别细,则会腐蚀掉,这样region的形状就会发生较大变化。


    4、圆角腐蚀以后,可能变成尖角。


    5、开运算会使尖角变平滑。


    6、对于凸多边形来说,闭运算之后,region不发生任何变化。


    7、对于有凹槽的非凸多边形来说,闭运算之后region的凹槽被填充。第一步膨胀过程中,夹角变圆角,第二步腐蚀过程中,圆角又可能复原成了尖角(见第4条)。

     

  • 相关阅读:
    idea 搭建spring boot
    面向对象
    idea 转普通项目为maven 项目
    java 基础
    设计模式
    GeneratedKeyHolder的作用:获得新建主键值
    Oracle中Merge into的用法实例讲解
    深入理解Java线程池:ThreadPoolExecutor
    java Timer(定时调用、实现固定时间执行)
    js实现数组去重
  • 原文地址:https://www.cnblogs.com/bile/p/10173945.html
Copyright © 2011-2022 走看看