floodFill填充函数函数(六)
一 函数原型
参数解释:
image 【输入/输出】1或者3通道、 8bit或者浮点图像。仅当参数flags的FLOODFILL_MASK_ONLY标志位被设置时image不会被修改,否则会被修改。
mask 【输入/输出】 操作掩码,必须为单通道、8bit,且比image宽2个像素、高2个像素。使用前必须先初始化。Flood-filling无法跨越mask中的非0像素。例如,一个边缘检测的结果可以作为mask来阻止边缘填充。在输出中,mask中与image中填充像素对应的像素点被设置为1,或者flags标志位中设置的值(详见flags标志位的解释)。此外,该函数还用1填充了mask的边缘来简化内部处理。因此,可以在多个调用中使用同一mask,以确保填充区域不会重叠。
seedPoint 起始像素点。
newVal 重绘像素区域的新的填充值(颜色)。
rect 可选输出参数,返回重绘区域的最小绑定矩形。
loDiff 当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大下行差异值。
upDiff 当前选定像素与其连通区中相邻像素中的一个像素,或者与加入该连通区的一个seedPoint像素,二者之间的最大上行差异值。
flags flags标志位是一个32bit的int类型数据,其由3部分组成: 0-7bit表示邻接性(4邻接、8邻接);8-15bit表示mask的填充颜色;16-31bit表示填充模式(详见填充模式解释)
通俗解释:floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法)
填充方法
FLOODFILL_FIXED_RANGE 颜色填充
FLOODFILL_MASK_ONLY mask的指定的位置为零时才填充,不为零不填充
二 示例代码
#指定位置填充 def fill2_image(): image = np.zeros([200, 200, 3], np.uint8) #image[100:300, 100:300, :] = 255 cv.imshow("define", image) cv.imwrite('define.jpg',image) # mask 的高宽比原图多2,即h+2,w+2 mask = np.ones([202, 202, 1], np.uint8) # mask需要填充的位置的像素设置为0 mask[100:150, 100:150] = 0 #调用floodFill函数填充 (0,0,255)指定红色填充 cv.floodFill(image, mask, (100, 100), (0, 0, 255), cv.FLOODFILL_MASK_ONLY) cv.imshow("fill2", image) cv.imwrite('fill2.jpg',image) fill2_image() cv.waitKey(0) cv.destroyAllWindows()
填充原理图
三 指定颜色填充代码
import cv2 as cv import numpy as np #指定颜色替换 def fill_image(image): copyImage=image.copy() #复制图片 h,w=image.shape[:2] mask=np.zeros([h+2,w+2],np.uint8) #(0,80) 起始点,(0,100,255) 蓝色 ,(100,100,50)棕色 ,(50,50,50) 浅黑 cv.floodFill(copyImage,mask,(0,80),(0,100,255),(100,100,50),(50,50,50),cv.FLOODFILL_FIXED_RANGE) cv.imshow('fill',copyImage) src=cv.imread('./hua.jpg') cv.imshow('before',src) fill_image(src) cv.waitKey(0) cv.destroyAllWindows()
通俗解释:floodFill( 1.操作的图像, 2.掩模, 3.起始像素值,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法)
参数5.填充颜色的低值就是:参数3 减去 参数5
参数6.填充颜色的高值就是:参数3 加上 参数6
即是这两个数值之间的色素替换为参数4的颜色
效果展示