如何在Mathematica中实现液滴内正圆自动调整与数值计算
Mathematica 液滴轮廓内正圆超出区域面积计算实现
参考效果示意图:
实现步骤
第一步:提取/定义液滴轮廓区域
如果是从示例这类图像导入,直接用内置图像处理函数提取闭合液滴区域:(* 替换成你的液滴图像本地路径 *) img = Import["path/to/your/droplet/image.png"]; (* 二值化去噪后提取液滴闭合区域 *) dropletRegion = Binarize[img]//DeleteSmallComponents//EdgeDetect//ImageGraphics//First//DiscretizeGraphics如果你已经有液滴轮廓的参数化方程,直接替换成自定义的参数区域/隐式区域即可,不需要走图像提取流程。
第二步:确定正圆参数遍历规则
正圆共3个可调参数:圆心坐标{cx, cy}、半径r。如果不需要移动圆心,直接取液滴质心作为固定圆心即可:(* 取液滴质心为固定圆心,需要移动圆心可把cx、cy加入遍历列表 *) {cx0, cy0} = RegionCentroid[dropletRegion]; (* 按需求设置半径遍历范围、步长,步长越小精度越高 *) radiusRange = Range[0, Max[Subtract@@@RegionBounds[dropletRegion]]/2, 0.5];第三步:逐组参数计算超出区域面积
不需要手动逐块累加面积,直接用Mathematica原生区域运算求交集即可得到正圆超出液滴的部分,直接调用Area得到计算值:(* 遍历所有半径,返回{半径值, 对应超出面积}的结果列表 *) calcResult = Table[ circle = DiscretizeRegion[Disk[{cx0, cy0}, r], AccuracyGoal -> 3]; (* 超出区域=正圆和液滴外部区域的交集 *) outsidePart = RegionIntersection[circle, RegionComplement[dropletRegion]]; {r, Area[outsidePart]}, {r, radiusRange} ];
可选扩展功能
- 自动找液滴最大内切圆:直接调用优化函数求解超出面积为0时的最大半径和对应圆心位置
maxInscribedCircle = NMaximize[ {r, Area[RegionIntersection[Disk[{cx, cy}, r], RegionComplement[dropletRegion]]] < 10^-3}, {cx, cy, r} ] - 结果可视化校验:将液滴、不同半径的正圆叠加显示,核对超出区域计算是否符合预期
Show[ Graphics[{LightBlue, Opacity[0.7], dropletRegion}], Graphics[{Red, Opacity[0.3], Disk[{cx0, cy0}, #]& /@ radiusRange[[;; ;;10]]}], PlotRange -> All, Axes -> True ]
注意:如果图像分辨率较高,可适当调低
DiscretizeRegion的精度目标提升计算速度,精度要求高时再调高参数即可。
内容的提问来源于stack exchange,提问作者Hinata Shoyo
相关产品推荐
相关产品推荐

