在学OpenCV的时候遇到个函数floodFill()函数有点不解,特地在这里记录一下。
先说说它的参数
floorFill(image, mask , seedPoint, newVal, loDiff, upDiff, flags)
参数 | 说明 |
---|---|
image | 处理对象 |
mask | 掩膜(后面会说明) |
seedPoint | 填充的起点 |
newVal | 填充的颜色 |
loDiff | 填充时下限像素的差 |
upDiff | 填充时上限像素的差 |
flags | 填充的方式 :FLOODFILL_FIXED_RANGE 和FLOODFILL_MASK_ONLY |
先看例子,先理解一下flags的作用
先看flags=FLOODFILL_FIXED_RANGE的时候
def image_fill(image):
src = image.copy() #先创建一个副本
mask = np.zeros([src.shape[0]+2, src.shape[1]+2, 1], np.uint8) #根据副本形状建一个掩膜, 注意,长和宽必须要+2,类型只能是uint8
cv2.floodFill(src, mask, (60, 60), (0, 0, 255), (50,50,50), (50,50,50), cv2.FLOODFILL_FIXED_RANGE)
#(60,60)代表起始点;(0,0,255)代表填充颜色;loDiff=(50,50,50)代表只能填充比填充颜色小对应数值的点,upDiff同理
cv2.imshow('flood_fill', src)
cv2.imshow('mask', mask)
image1 = cv2.imread('lena.jpg') #原图
cv2.imshow('image1', image1)
image_fill(image1)
c = cv2.waitKey(0)
cv2.destroyAllWindows()
来看看结果
这里mask的作用是限制填充的范围,即floodFill只会填充处理对象对应的mask为0的区域,上面我将mask设置为全部都是0,所以作用范围是整张图片 (注意,作用范围是整张图片不代表会填充整张图,同时还要满足像素和填充颜色的像素差在[loDiff,upDiff]范围内) 那么,如果mask只设置一部分为0会怎么怎么样呢
(下面代码只需要重点关注mask的修改,其余部分同上)
def