使用Numpy(Python 3)生成软圆形掩膜:计算像素被圆覆盖的面积占比
软圆形掩膜实现方案
核心思路
你需要的软边缘圆形掩膜可以通过超采样统计法实现,该方案不需要复杂的几何相交面积计算,实现逻辑简单,且精度可调,完全满足你1%误差的要求。
具体逻辑为:将每个原始像素拆分为N×N个更小的采样点,统计每个原始像素对应采样点中落在圆内的比例,该比例即为该像素的权重。当N取10时,最大误差不超过1%,刚好符合你的精度要求。
实现代码
接口完全兼容你之前使用的二值掩膜、高斯掩膜函数,可直接替换:
import numpy as np def soft_circle(size=19, r=7, x_offset=0, y_offset=0, sample_scale=10): # sample_scale为超采样倍率,取值10时误差上限为1%,可按需调整 high_res_size = size * sample_scale # 计算超采样网格下的圆心坐标 x0 = y0 = (size / 2) * sample_scale x0 += x_offset * sample_scale y0 += y_offset * sample_scale # 生成超采样坐标网格,保持y轴方向和原有函数一致 y, x = np.ogrid[:high_res_size, :high_res_size] y = y[::-1] # 生成超采样分辨率的二值圆掩膜 high_res_mask = ((x - x0)**2 + (y - y0)**2) <= (r * sample_scale)**2 high_res_mask = high_res_mask.astype(np.float32) # 平均池化降采样回原始尺寸,得到每个像素的覆盖比例权重 mask = high_res_mask.reshape(size, sample_scale, size, sample_scale).mean(axis=(1, 3)) return mask
方案优势
- 完全匹配需求:完全落在圆内的像素权重固定为1,边缘像素权重等于实际覆盖面积占比,不会出现高斯掩膜内部权重下降的问题
- 实现成本低:不需要处理圆形和正方形相交的复杂几何边界判断,不易出逻辑错误
- 精度灵活可调:修改
sample_scale参数即可调整精度,取值越大误差越小,10即可满足你1%的误差要求 - 接口兼容:参数和你原有掩膜函数完全对齐,调用侧不需要修改逻辑即可替换使用
内容的提问来源于stack exchange,提问作者OM222O
相关产品推荐
相关产品推荐

