学python和halcon哪个好学_一起学python-opencv二十五(opencv分水岭算法实践,GrabCut交互式前景提取)...

de87fc758b19c2bac90ee7fee3032590.png

opencv分水岭实践

opencv有一个例子,这个例子是分割相互接触的物体。d505888214101ab395081ac5d5b61279.png

得到的结果一定是相互接触的。95a387ebbf95f0cba532de4fddd55748.png

除去白点噪声,可以用开操作。如果里面有黑色的孔洞,可以用闭操作去除。上面的意思就是说因为结果是连着的,所以其实物体的边界是不太确定的。860e09f7653327d1d838ef99f5410e9e.png

cfbab65d29954e07f1f9414fd39a2b73.png

先用开操除去了一些噪点,其实iterations=1或者2结果都一样。这上面前景的获得是通过一个距离变换,然后二值化得到的。用到的函数是distanceTransform。b03f73979f9cf03cf36383cf9d62c560.png

7e0eb3d3aa502c9664f00ecb32d43b93.png

距离有很多类型的定义。110cd4d3cea222199b9ff9e4d5db61b9.png

这个就是模板的大小。也就是在多大的正方形内计算距离。25a97040368508e20df694835ceea2fe.png

这里用距离变换只是为了得到硬币比较中心的位置而已,因为这些位置我们可以确定是单个硬币的区域,我觉得腐蚀完全可以完成这个功能,不过可能得多腐蚀几次或者用比较大的探针。

这个距离变换之后二值化的阈值也是随便选的而已,并没有什么太大的讲究,只要得到一个比较小的区域就可以。8a4aa108c79bac129f7fb7cd37f7d8fd.png

这里得到位置区域的意思是,这些区域并不能分辨出来是属于哪一个硬币的或者是背景,所以是unknow。f6312f66f220b4ba52a94c4f402e67bd.png

aabf294501467e4bcd64cc3feac05c70.png

这个函数可能就是用形态学操作提取出来的连通区域(上面简单说过这种方法)。66d2565ef63a5df8dfcb0a51a5799d9f.png

背景标签,背景应该就被认为是黑色的部分。可以选择4邻域或者8邻域的算法,并且算法也有很多。7871a883f768eb60a57bd950bfa8798d.png

不过这个函数还有一种输入时不需要这个参数的,这个函数输出有retval和lables,等会试验一下都是什么。21c59177f78975dc0364f978e76886d4.png

但是如果背景被标记为0,那么分水岭算法会把它视作未知区域(前面介绍过),所以我们想要用一个不同的整数来标记它。我们把未知区域标记为0,而不是背景。markers=markers+1就是为了不让背景为1。7d4c527cbe2717ae367707cefbe762fe.png

然后把unknow区域的都标记为0,在unknow图里面白色的是位置区域,所以是==255。29feaf4c628c3656c5d4ca634a944a85.png

8a3782bc4a4584e70d9121a1a0ac12c2.png

最后让输出的边界也就是值==-1的都化成红色,代表边界。

下面就来整体试验一下:

一般都是先滤波。滤波之后是这样的。13d8fd64db590e186a93c73e85804ece.png

这个可以不用开运算滤波了。得到的未知区域为。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值