当前位置: 首页 > news >正文

漫水填充算法

漫水填充算法

一、技术背景

在二值图像处理中,目标区域内部可能存在孔洞(背景色的孤立区域)。这些孔洞会影响轮廓检测、面积计算等后续分析的准确性。漫水填充算法(Flood Fill)是一种区域填充算法,可以用于填充封闭区域或检测孔洞。

本文介绍 SEM 项目中imageUtils.fillHoles()的实现原理,包括四连通/八连通原理、边界填充、BitwiseNot 和 BitwiseOr 合并操作。


二、数学原理

2.1 漫水填充算法

漫水填充算法从指定种子点出发,将与种子点连通且满足一定条件的像素填充为目标颜色。

算法步骤:

  1. 从种子点( x 0 , y 0 ) (x_0, y_0)(x0,y0)开始
  2. 检查该点是否满足填充条件
  3. 如果满足,填充该点并加入队列
  4. 从队列取出点,检查其邻域
  5. 重复直到队列空

2.2 连通性

四连通:只考虑上下左右4个邻居

N 4 ( p ) = { ( x + 1 , y ) , ( x − 1 , y ) , ( x , y + 1 ) , ( x , y − 1 ) } N_4(p) = \{(x+1, y), (x-1, y), (x, y+1), (x, y-1)\}N4(p)={(x+1,y),(x1,y),(x,y+1),(x,y1)}

八连通:考虑周围8个邻居

N 8 ( p ) = N 4 ( p ) ∪ { ( x + 1 , y + 1 ) , ( x + 1 , y − 1 ) , ( x − 1 , y + 1 ) , ( x − 1 , y − 1 ) } N_8(p) = N_4(p) \cup \{(x+1, y+1), (x+1, y-1), (x-1, y+1), (x-1, y-1)\}N8(p)=N4(p){(x+1,y+1),(x+1,y1),(x1,y+1),(x1,y1)}

2.3 孔洞填充原理

孔洞填充的核心思想是:

  1. 从图像边界开始漫水填充背景(将边界连通的背景填充为白色)
  2. 反转填充结果(背景变为黑色,孔洞变为白色)
  3. 将反转结果与原图进行或运算(合并孔洞和目标区域)

数学表达:

R e s u l t = O r i g i n a l ∪ ( B a c k g r o u n d f i l l e d ) c Result = Original \cup (Background_{filled})^cResult=Original(Backgroundfilled)c

其中,( B a c k g r o u n d f i l l e d ) c (Background_{filled})^c(Backgroundfilled)c表示填充后背景的补集。


三、代码实现

以下代码来自e:\SEM\Utils\imageUtils.cs

//填充孔洞publicstaticvoidfillHoles(refMatsrc_img){Matfilled_img=newMat(src_img.Size(),MatType.CV_8UC1,Scalar.Black);for(inti=0;i<src_img.Rows;i++){for(intj=0;j<src_img.Cols;j++){if(src_img.At<Vec3b>(i,j)==newVec3b(0,0,0)){filled_img.At<byte>(i,j)=0;}else{filled_img.At<byte>(i,j)=255;}}}inth=src_img.Rows;intw=src_img.Cols;Matimg_floodfill=filled_img.Clone();MatMask=newMat();intpadding=2;Cv2.CopyMakeBorder(img_floodfill,Mask,padding,padding,padding,padding,BorderTypes.Constant,newScalar(0));Cv2.FloodFill(Mask,newPoint(0,0),newScalar(255));Matimage_floodfill_inv=newMat();Cv2.BitwiseNot(Mask,image_floodfill_inv);Matroi=newMat(image_floodfill_inv,newRect(padding,padding,src_img.Cols,src_img.Rows));Matresult_img=newMat();Cv2.BitwiseOr(filled_img,roi,result_img);src_img=result_img.Clone();}

处理流程详解

  1. 彩色转灰度二值:将彩色图像转换为灰度二值图像(黑色为0,白色为255)
  2. 边界扩展:使用CopyMakeBorder在图像周围添加边框,创建掩码
  3. 漫水填充:从(0,0)点开始填充背景区域为白色
  4. 反转:使用BitwiseNot反转填充结果
  5. 提取ROI:去除添加的边框,恢复原始尺寸
  6. 合并:使用BitwiseOr将孔洞区域与原图合并

OpenCV API

// 漫水填充intCv2.FloodFill(Matsrc,// 输入图像Matmask,// 掩码(比原图大2像素)PointseedPoint,// 种子点ScalarnewVal,// 填充颜色outRectrect,// 填充区域边界Scalar?loDiff,// 低阈值差(可选)Scalar?upDiff,// 高阈值差(可选)FloodFillFlags flags// 填充模式);// 按位取反Cv2.BitwiseNot(Matsrc,Matdst);// 按位或Cv2.BitwiseOr(Matsrc1,Matsrc2,Matdst);// 边界扩展Cv2.CopyMakeBorder(Matsrc,Matdst,inttop,intbottom,intleft,intright,BorderTypesborderType,Scalar?value);

四、参数调优

4.1 连通性选择

连通性特点适用场景
四连通严格,填充范围小目标边界复杂
八连通宽松,填充范围大目标边界平滑

通过FloodFillFlags设置:

  • FloodFillFlags.FixedRange:使用固定范围
  • FloodFillFlags.MaskOnly:只修改掩码

4.2 边界扩展参数

参数推荐值说明
padding2通常设为2(漫水填充需要掩码比原图大)
borderTypeConstant常量填充
value0边界值为黑色

4.3 种子点选择

种子点通常选择图像边角位置:

  • (0, 0):左上角
  • (0, height-1):左下角
  • (width-1, 0):右上角
  • (width-1, height-1):右下角

五、常见问题

Q1:填充后目标区域也被填充?

原因:种子点选择在目标区域内部。

解决方案

  • 确保种子点在背景区域(如边角位置)
  • 检查目标是否完全封闭

Q2:孔洞未被完全填充?

原因:孔洞与边界连通,或连通性设置不当。

解决方案

  • 确保目标区域完全封闭
  • 检查是否需要先进行形态学闭运算

Q3:为什么需要添加边界扩展?

原因:OpenCV 的漫水填充要求掩码比原图至少大2像素。

解决方案

  • 使用CopyMakeBorder添加边框
  • 填充完成后提取ROI恢复原始尺寸

Q4:彩色图像如何处理?

解决方案

  • 先转换为灰度或二值图像
  • 示例代码中已包含彩色到灰度的转换逻辑

Q5:漫水填充与形态学闭运算的区别?

特性漫水填充形态学闭运算
孔洞类型内部封闭孔洞边缘小缺口
填充效果完全填充部分填充
边界影响不影响边界可能改变边界
计算速度较慢较快
http://www.jsqmd.com/news/1221755/

相关文章:

  • 高速USB OTG控制器架构解析:从协议原理到SoC集成与调试实践
  • 附近有上门回收手表的吗?2026 长沙芙蓉区易奢福 24 小时随叫随到 - 肉松卷
  • LabVIEW在暖通空调控制系统中的应用与优化
  • Flutter插件开发:MethodChannel原理与Android实现
  • 高性能iOS固件恢复引擎架构解析与深度技术实现
  • Gini指数:决策树中的不纯度量化与公平性诊断工具
  • 上海亨得利网点地址电话客服查询提供专业售后维修保养服务权威公示(2026年7月最新) - 亨得利官方
  • C++类库管理系统设计:从依赖解析到构建集成的全流程实践
  • 2026年07月水泥轨枕与水泥枕木行业重点生产企业推荐榜 - 甄选服务推荐
  • C++条件变量8大应用模式:从生产者消费者到性能优化实战
  • 概率思维:机器学习工程师的底层生存能力
  • 形态学腐蚀
  • 2026年07月全屋定制行业深度观察:从规模扩张到价值竞争的品牌实力榜 - 甄选服务推荐
  • Windows 11系统清理优化终极指南:3步快速提升性能与隐私保护
  • 基于YOLOv8的多目标检测系统开发与优化实践
  • Copilot图表制作正在淘汰传统Excel工程师:2024Q2头部科技公司内部培训首曝的6项能力红线
  • 2026 年朝阳正规的首饰回收店找哪家,别扔!这批老首饰的价值可能让你震惊 - 行业推荐官【官方】
  • Title Fight悉尼现场解析:后硬核音乐与演出档案的技术价值
  • 大模型岗位变了,数据分析工程师该补的还是算法吗?
  • Ubuntu 16.04编译Android 6.0源码的优化实践
  • 亲身探访重庆雷达官方售后服务中心|全部网点地址及24小时热线(2026年7月最新) - 亨得利官方服务中心
  • 2026年7月最新芝柏杭州绿汀路万象城维修保养服务电话 - 亨得利官方服务中心
  • Android开发:XUtils3环境搭建与核心功能详解
  • 深入解析McBSP:嵌入式音频与数据通信的核心接口配置与应用
  • 积家中国官方售后服务中心|官方地址及24小时售后电话权威信息公示(2026年7月更新) - 积家官方售后服务中心
  • Boost 1.54.0在Linux下的编译与项目集成实践
  • Android库发布Jcenter完整指南与迁移建议
  • 亲身到店探访西安欧米茄官方售后服务中心|最新地址与24小时服务电话(2026年7月最新) - 欧米茄服务中心
  • 行业首曝!头部MCN内部培训课件流出:AI数字人IP人设定位SOP(含16维人格建模表+300+话术情绪标签库)
  • 2026 上海虹口区电路维修哪家靠谱?三家公司深度对比 - 匠心24小时快修