python+opencv 漫水填充(floodFill)实例详解

思想

  • 漫水填充:就是将与种子点相连接的区域换成特定的颜色,通过设置连通方式或像素的范围可以控制填充的效果。通常是用来标记或分离图像的一部分对其进行处理或分析,或者通过掩码来加速处理过程。可以只处理掩码指定的部分或者对掩码上的区域进行屏蔽不处理。
  • 主要作用就是:选出与种子点连通的且颜色相近的点,对像素点的值进行处理。如果遇到掩码,根据掩码进行处理。
  • 工作流程:
    • 选定种子点(x,y)
    • 检查种子点的颜色,如果该点颜色与周围连接点的颜色不相同,则将周围点颜色设置为该点颜色,如果相同则不做处理。但是周围点不一定都会变成和种子点的颜色相同,如果周围连接点在给定的范围内(lodiff - updiff)内或在种子点的象素范围内才会改变颜色。
    • 检测其他连接点,进行2步骤的处理,直到没有连接点,即到达检测区域边界停止。
  • PS:我是思想的搬运工

作者:kalp_yp
来源:CSDN
原文:https://blog.csdn.net/u013539952/article/details/80702849
版权声明:本文为博主原创文章,转载请附上博文链接!


  • 下面开始我自己对于该模块的理解:
floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
  • Iimage:输入图像,可以是一通道或者是三通道。
  • mask:该版本特有的掩膜。 单通道,8位,在长宽上都比原图像image多2个像素点。另外,当flag为FLOORFILL_MAK_ONLY时,只会填充mask中数值为0的区域。
  • seedPoint:漫水填充的种子点,即起始点。
  • newVal:被填充的像素点新的像素值
  • loDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最大值。
  • upDiff:表示当前的观察点像素值与其相邻区域像素值或待加入该区域的像素之间的亮度或颜色之间负差的最小值。
  • flag:
    • 当为CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。(改变图像)
    • CV_FLOODFILL_MASK_ONLY 此位设置填充的对像, 若设置此位,则mask不能为空,此时,函数不填充原始图像img,而是填充掩码图像.
  • 下面通过一个实例进行演示CV_FLOODFILL_FIXED_RANGE的情况:
def fill_color_demo(image):
    copyIma = image.copy()
    h, w = image.shape[:2]
    print(h, w)
    mask = np.zeros([h+2, w+2], np.uint8)
    cv.floodFill(copyIma, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)  
    cv.imshow("fill_color", copyIma)

src = cv.imread("C:\\Users\\ZhouYu\\Desktop\\9.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
fill_color_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

输入图:
python+opencv 漫水填充(floodFill)实例详解_第1张图片

输出图:
python+opencv 漫水填充(floodFill)实例详解_第2张图片
解析以上代码:

  • (30,30)为种子点的位置
    python+opencv 漫水填充(floodFill)实例详解_第3张图片
  • (0,255,255)为RGB颜色中的黄色
    • 可以看到种子点周边的颜色都接近为蓝色,因此都填充为黄色,但是当靠近中心,变成了绿色,因此就不在往中心进行判断。具体的判断准则是:
      • src(seed.x’, seed.y’) - loDiff <= src(x, y) <= src(seed.x’, seed.y’) +upDiff
  • 下面通过一个实例进行演示CV_FLOODFILL_MASK_ONLY:
def fill_binary():
    image = np.zeros([400, 400, 3], np.uint8)
    image[100:300, 100:300, : ] = 255
    cv.imshow("fill_binary", image)
    mask = np.ones([402, 402, 1], np.uint8)
    mask[101:301, 101:301] = 0
    cv.floodFill(image, mask, (200, 200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("filled binary", image)
fill_fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()

结果图:
python+opencv 漫水填充(floodFill)实例详解_第4张图片

你可能感兴趣的:(opencv)