OpenCV 漫水填充算法的使用及原理

本文架构

  • 漫水填充算法的简单介绍
  • 漫水填充算法的实现原理
  • 漫水填充算法floodFill函数及其参数介绍
  • 漫水填充算法的使用案例

漫水填充算法

漫水填充算法(FloodFill)是在很多图形绘制软件中常用的填充算法。

通常是自动选中与种子像素相连的区域,利用指定的颜色进行区域的颜色填充。

漫水填充算法(FloodFill)常用于标记或者分离图像的一部分,以便做进一步分析和处理。

Windows的画图工具中的油漆桶功能和Photoshop的魔术棒选择工具,都是通过漫水填充算法的改进。


漫水填充算法的实现原理

从一个点(初始点)开始,遍历附近的像素点,填充成新的颜色,直到封闭区域内所有像素点被填充成新的颜色为止。

漫水填充的实现有以下方法:

  1. 4邻域像素填充法
  2. 8邻域像素填充法
  3. 基于扫描线的像素填充方法

漫水填充算法floodFill函数及其参数介绍

floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=None)
  • img:输入图像,可以是一通道或者是三通道。
  • mask:单通道,8位,在长宽上都比原图像image多2个像素点。漫水填充不会填充mask的非零像素区域(可以用边缘检测算子输出来防止填充到边界),mask中与输入图像(x,y)像素点相对应的点坐标为(x+1,y+1)。另外,当flag为FLOORFILL_MAK_ONLY时,只会填充mask中数值为0的区域。
  • seedPoint:漫水填充的种子点,即起始点。
  • newVal:被填充的像素点新的像素值(像素点被染颜色的值, 即在重绘区域像素的新值)
  • loDiff:默认值Scalar(), 表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之负差(lower brightness/color difference)最大值
  • upDiff:默认值Scalar(),表示当前观察像素值与其部件邻域像素值或者待加入该部件的种子像素之间的亮度或颜色之正差(lower brightness/color difference)最大值
  • flags:当为CV_FLOODFILL_FIXED_RANGE 时,待处理的像素点与种子点作比较,在范围之内,则填充此像素 。当为CV_FLOODFILL_MASK_ONLY时,mask不能为空,此时,函数不填充原始图像img,而是填充掩码图像.

漫水填充算法的使用案例

#encoding=utf8
import cv2 as cv
import numpy as np

def fill_color_demo(image):
    copyImg = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([h+2, w+2],np.uint8)   #mask必须行和列都加2,且必须为uint8单通道阵列
    #为什么要加2可以这么理解:当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理
    cv.floodFill(copyImg, mask, (227, 500), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("fill_color_demo", copyImg)
    
src = cv.imread('pic.jpg')
cv.imshow('input_image', src)
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV 漫水填充算法的使用及原理_第1张图片


你可能感兴趣的:(计算机视觉)