如图所示,这是通过边缘检测得到的物体边沿结果,而我们的目标是将图中的类似椭圆区域分割出来。这里就可以用到漫水填充法,函数cv2.floodFill()。
漫水填充法是一种用特定的颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的方法。漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。
import cv2
import numpy as np
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))#腐蚀膨胀的算子
image = np.ones((100, 100), np.uint8)*255
edges = np.zeros((102,102),np.uint8)#掩码,长短需要加2个像素
edges_1[0:100,0:100] = edges
cv2.floodFill(image, edges_1, (0, 0), 0, cv2.FLOODFILL_MASK_ONLY)#漫水填充
mask = cv2.erode(image, kernel)#腐蚀
mask = cv2.dilate(mask , kernel)#膨胀
floodFill( 1.操作图像, 2.掩模, 3.起始点,4.填充的颜色, 5.填充颜色的低值,6.填充颜色的高值 ,7.填充方法)
1:输入图像,可以是一通道或者是三通道。
2:该版本特有的掩膜。 单通道,8位,在长宽上都比原图像image多2个像素点。另外,当flag为FLOORFILL_MAK_ONLY时,只会填充mask中数值为0的区域。
3:漫水填充的种子点,即起始点。
4:被填充的像素点新的像素值
5:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最大值。
6:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最小值。
7:
当为CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。(改变图像)
CV_FLOODFILL_MASK_ONLY 此位设置填充的对像, 若设置此位,则mask不能为空,此时,函数不填充原始图像img,而是填充掩码图像.