OpenCV中cv2.floodFill算法详解与实战应用

云舒
云舒
发布时间:2026-10-15 | 5人浏览过
原创

本文深入解析OpenCV中cv2.floodFill泛洪填充算法的核心参数与工作原理。详细讲解种子点、颜色差异范围(loDiff/upDiff)、连通性标志及掩码层mask的配置方法。通过彩色图像填充与结合minAreaRect提取旋转矩形的两个实战案例,展示如何灵活运用FLOODFILL_FIXED_RANGE与FLOODFILL_MASK_ONLY模式,帮助开发者掌握区域分割与特征提取技巧。

一、泛洪算法——floodFill函数原型


cv2.floodFill(img,mask,seed,newvalue(BGR),(loDiff1,loDiff2,loDiff3),(upDiff1,upDiff2,upDiff3),flag)
  • img:指定待进行泛洪填充操作的源图像。
  • mask:定义掩码层,用于限制泛洪算法的作用区域。若需对整幅图像进行操作,掩码的尺寸应比原图大,具体为行数加2、列数加2。该掩码是一个二维矩阵,数据类型为(np.uint8),初始值全为0。在算法执行过程中,边缘一圈会被自动置为1,而只有对应原图位置为0的区域才允许进行泛洪操作,因此初始化时必须确保掩码为0矩阵。
  • seed:指定泛洪算法的种子点坐标。算法依据该种子点的像素值,判断与其颜色相近的像素点是否纳入泛洪区域。此过程类似于所描述的原理。
  • newvalue:指定泛洪区域填充的新颜色值,格式为(B, G, R)。
  • (loDiff1, loDiff2, loDiff3):定义相对于种子点像素值允许向下的颜色差异范围。若种子点像素为(B0, G0, R0),则泛洪区域的下界颜色值为(B0-loDiff1, G0-loDiff2, R0-loDiff3)。
  • (upDiff1, upDiff2, upDiff3):定义相对于种子点像素值允许向上的颜色差异范围。若种子点像素为(B0, G0, R0),则泛洪区域的上界颜色值为(B0+upDiff1, G0+upDiff2, R0+upDiff3)。
  • flag:控制泛洪算法的具体处理模式,由多个位域组成。

  • 低八位:控制算法的连通性,决定是以种子点为中心,判断周围4个像素点还是8个像素点,并将泛洪区域内像素点的周围像素纳入考虑。通常设置为4或8,默认值为4。
  • 中间八位:与掩码层的赋值行为密切相关。一般建议使用(255<<8),使中间8位全为1,此时掩码层对应原图泛洪区域的值将被赋为255;若中间8位为0,则赋值为1。
  • 高八位 由OpenCV宏参数指定
    • cv2.FLOODFILL_FIXED_RANGE:启用此标志表示改变图像内容,填充指定的newvalue颜色。
    • cv2.FLOODFILL_MASK_ONLY:启用此标志表示不改变原图像,即newvalue参数失效,转而修改对应区域的掩码值,将其设置为中间八位所指定的值。

二、简单应用


#泛洪填充(彩色图像填充)
import cv2
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, (220, 250), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv.FLOODFILL_FIXED_RANGE)
    cv.imshow("fill_color_demo", copyImg)
 
src = cv.imread('E:/imageload/baboon.jpg')
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

三、应用,结合minAreaRect


cv2.floodFill(initial_car,mask,(seed_x,seed_y),(255,0,0),(loDiff,loDiff,loDiff),(upDiff,upDiff,upDiff),flag)
 
points = []
row,column = mask.shape
 
for i in range(row):
    for j in range(column):
        if mask[i][j]==255:
           points.append((j,i))   #点应该输入点坐标(列,行)
points = np.asarray(points)
new_rect = cv2.minAreaRect(points)

到此这篇关于OpenCV中cv2.floodFill算法的使用的文章就介绍到这了,更多相关OpenCV cv2.floodFill内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表