(转载)Python图像处理(7):利用轮廓分块处理

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息


在得到绿色植物的前景图像后,我们希望能够进一步标识出其中的棉花植株和杂草。测试图像仍然是它:


首先要做的当然是对图像进行分区域处理。在上一步中我们得到了标识绿色植物的二值图像,一个很自然的想法是利用此二值图像的轮廓进行分块。


[python] view plain copy
  1. # 获取轮廓,我们的目的是分块,因此只使用外层轮廓,使用点序列的形式  
  2. bin_img_save = np.copy(bin_img)  
  3. (contoures, hierarchy) = cv2.findContours(bin_img_save, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  

这里需要注意的是,在使用findContours函数前必须将图像复制一份,否则此函数将改变传入的图像数据。


计算的结果居然有49个区域,对于太小的区域其实我们并不关心,我们计算区域面积并从大到小进行排序。OpenCV提供了两个排序函数,sortsortIdx,其中sort可以得到排序后的值数组,而sortIdx能够得到这些值在原数组中的序号,因而这里使用sortIdx

[python] view plain copy
  1. # 按面积排序  
  2. areas = np.zeros( len(contoures) )  
  3. idx = 0  
  4. for cont in contoures :   
  5.     areas[idx] = cv2.contourArea(cont)  
  6.     idx = idx + 1  
  7. areas_s = cv2.sortIdx(areas, cv2.SORT_DESCENDING | cv2.SORT_EVERY_COLUMN)  

然后处理面积大于100的区域:

[python] view plain copy
  1. (b8, g8, r8) = cv2.split(src)  
  2.   
  3. # 对每个区域进行处理  
  4. for idx in areas_s :  
  5.     if areas[idx] < 100 :  
  6.         break  
  7.   
  8.     # 绘制区域图像,通过将thickness设置为-1可以填充整个区域,否则只绘制边缘  
  9.     poly_img = np.zeros( bin_img.shape, dtype = np.uint8 )  
  10.     cv2.drawContours(poly_img, contoures, idx, [255,255,255], -1)  
  11.     poly_img = poly_img & bin_img  
  12.   
  13.     # 得到彩色的图像  
  14.     color_img = cv2.merge([b8 & poly_img, g8 & poly_img, r8 & poly_img])  
  15.   
  16.     cv2.imshow('poly_img', color_img)  
  17.     cv2.waitKey()  

目前我们仅仅是显示这块区域的彩色图像。最后得到这样的结果:





我们需要正确标识这两块区域是棉花还是杂草。



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lights_joy/article/details/46368197
  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值