python中floodFill函数的理解和应用(参数说明,利用mask屏蔽未填充区域)

Python: cv2.floodFill( image, mask, seedPoint, newVal [ , loDiff [ , upDiff [ , flags ]]] )------------官方说明手册中定义形式

参数说明:

image:输入/输出1或3通道、8位或浮点图像。除非在函数的第二个变量中设置了“FLOODFILL_MASK_ONLY”标志,否则它将由函数修改。(FLOODFILL_MASK_ONLY:这个是最后一个参数中flags中的其中一项)

mask:表示操作掩模,应为单通道8位图像,应比image宽2像素 高2像素。函数使用并更新掩码,因此您负责初始化掩码内容。整体填充不能穿过遮罩中的非零像素。例如,可以使用边缘检测器输出作为遮罩来停止边缘填充。可以在对函数的多次调用中使用相同的掩码,以确保填充区域不重叠。

seedPoint: 填充起始点.

newVal:重新填入像素点的数值

loDiff:当前观察到的像素与相邻像素之一或种子像素之间的最大较低亮度/颜色差异。  

upDiff:当前观察到的像素与相邻像素之一或种子像素之间的最大较高亮度/颜色差异。

            (当满足条件loDiff<当前-相邻或种子像素<upDiff,满足区域被填充,相邻或者种子的选择由flags中的             FLOODFILL_FIXED_RANGE决定,简单来说设置该参数就是与种子比较未设置就是与相邻比较,具体见flags参数说明)

flags:

            低八位(第0~7位)用于控制算法的连通性,可取4 (4为缺省值) 或者 8。如果设为4,表示填充算法只考虑当前像素水平方向和垂直方向的相邻点;如果设为 8,除上述相邻点外,还会包含对角线方向的相邻点。

           中间八位部分,Floodfill的flags参数的中间八位的值就是用于指定填充掩码图像的值的。但如果flags中间八位的值为0,则掩码会用1来填充。

            高八位部分(16~23位)可以为0 或者如下两种选项标识符的组合:  

            FLOODFILL_FIXED_RANGE - 如果设置为这个标识符的话,就会考虑当前像素与种子像素之间的差,否则就考虑当前像素与其相邻像素的差。也就是说,这个范围是浮动的。
             FLOODFILL_MASK_ONLY - 如果设置为这个标识符的话,函数不会去填充改变原始图像 (也就是忽略第三个参数newVal), 而是去填充掩模图像(mask)。

例子:

cv.floodFill(copyImage, mask, (900, 600), (0, 100, 255), (100, 100, 50), (50, 50, 50), flags=4|(255<<8)|cv.FLOODFILL_FIXED_RANGE)
#-----unlock------
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)  # 新建图像矩阵  +2是官方函数要求
    cv.floodFill(copyImage, mask, (900, 600), (0, 100, 255), (100, 100, 50), (50, 50, 50), flags=4|(255<<8)|cv.FLOODFILL_FIXED_RANGE)
    mask_copy= mask[1:h+1,1:w+1]#把掩码中的数值取出来大小和原图一样,这样才能和原图进行运算,注意掩码的取值范围从1到h/w+1
    mask_copy = cv.merge([mask_copy,mask_copy,mask_copy])#要进行图像操作通道数目要一致,用merge函数合并出一个三通道图像
    src = cv.bitwise_and(image, mask_copy)#两个图像相与,mask中非标记区域为0与出来的结果也是0,起到屏蔽作用
    cv.namedWindow("fill", cv.WINDOW_NORMAL)
    cv.imshow("fill", copyImage)#显示填充过后的图像
    cv.namedWindow("and", cv.WINDOW_NORMAL)#显示屏蔽过后图像
    cv.imshow("and",src )
    return src


src = cv.imread("/home/xhy/PycharmProjects/materials/demo0.jpeg")#读取图片
cv.namedWindow("raw", cv.WINDOW_NORMAL)#设置框体大小和名字
cv.imshow("raw", src)
fill_image(src)


'''
#采用摄像头识别连续动态图
capture = cv.VideoCapture(0)  # 打开摄像头,0代表的是设备id,如果有多个摄像头,可以设置其他数值,也可以设置视频路径
while True:
    ret, frame = capture.read()  # 读取摄像头,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表有没有读到图片;第二个参数是frame,是当前截取一帧的图片
    frame = cv.flip(frame, 1)  # 翻转 0:上下颠倒 大于0水平颠倒   小于180旋转
    cv.imshow('camera',fill_image(frame))
    cv.waitKey(1)#等待函数不能少
'''


cv.waitKey(0)
cv.destroyAllWindows()

 

 

 

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值