快乐虾
http://blog.csdn.net/lights_joy/
欢迎转载,但请保留作者信息
在得到绿色植物的前景图像后,我们希望能够进一步标识出其中的棉花植株和杂草。测试图像仍然是它:
首先要做的当然是对图像进行分区域处理。在上一步中我们得到了标识绿色植物的二值图像,一个很自然的想法是利用此二值图像的轮廓进行分块。
- # 获取轮廓,我们的目的是分块,因此只使用外层轮廓,使用点序列的形式
- bin_img_save = np.copy(bin_img)
- (contoures, hierarchy) = cv2.findContours(bin_img_save, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
这里需要注意的是,在使用 findContours 函数前必须将图像复制一份,否则此函数将改变传入的图像数据。
计算的结果居然有 49 个区域,对于太小的区域其实我们并不关心,我们计算区域面积并从大到小进行排序。 OpenCV 提供了两个排序函数, sort 和 sortIdx ,其中 sort 可以得到排序后的值数组,而 sortIdx 能够得到这些值在原数组中的序号,因而这里使用 sortIdx 。
- # 按面积排序
- areas = np.zeros( len(contoures) )
- idx = 0
- for cont in contoures :
- areas[idx] = cv2.contourArea(cont)
- idx = idx + 1
- areas_s = cv2.sortIdx(areas, cv2.SORT_DESCENDING | cv2.SORT_EVERY_COLUMN)
然后处理面积大于 100 的区域:
- (b8, g8, r8) = cv2.split(src)
- # 对每个区域进行处理
- for idx in areas_s :
- if areas[idx] < 100 :
- break
- # 绘制区域图像,通过将thickness设置为-1可以填充整个区域,否则只绘制边缘
- poly_img = np.zeros( bin_img.shape, dtype = np.uint8 )
- cv2.drawContours(poly_img, contoures, idx, [ 255 , 255 , 255 ], - 1 )
- poly_img = poly_img & bin_img
- # 得到彩色的图像
- color_img = cv2.merge([b8 & poly_img, g8 & poly_img, r8 & poly_img])
- cv2.imshow( 'poly_img' , color_img)
- cv2.waitKey()
目前我们仅仅是显示这块区域的彩色图像。最后得到这样的结果:
我们需要正确标识这两块区域是棉花还是杂草。