格式统一
This commit is contained in:
@ -264,56 +264,54 @@ def multi_band_glint_detection(dataset, img_path, water_mask, glint_waves, weigh
|
||||
@timeit
|
||||
def adaptive_threshold(img, data_water_mask, window_size=15, percentile=90, foreground=1, background=0):
|
||||
"""
|
||||
自适应阈值方法
|
||||
基于局部统计特性进行阈值分割,对光照变化更稳健
|
||||
|
||||
自适应阈值方法(scipy.ndimage.percentile_filter 加速版)
|
||||
|
||||
对每个像素,在局部窗口内计算百分位数作为动态阈值:
|
||||
像素值 > 局部{percentile}%分位数 → 耀斑
|
||||
|
||||
与原始逐像素双重循环语义完全一致,但使用 scipy 的 C 级向量化实现,
|
||||
速度提升 1000+ 倍。
|
||||
|
||||
Args:
|
||||
img: 输入图像数组
|
||||
img: 输入图像数组(已做百分位数拉伸到 0-255 的整数类型)
|
||||
data_water_mask: 水域掩膜
|
||||
window_size: 局部窗口大小(奇数)
|
||||
percentile: 局部百分位数阈值
|
||||
window_size: 局部窗口大小(奇数,默认 15)
|
||||
percentile: 局部百分位数阈值(默认 90,即高于局部90%像素值)
|
||||
foreground: 前景值
|
||||
background: 背景值
|
||||
|
||||
|
||||
Returns:
|
||||
二值化检测结果
|
||||
"""
|
||||
height, width = img.shape
|
||||
|
||||
from scipy.ndimage import percentile_filter
|
||||
|
||||
# 确保窗口大小为奇数
|
||||
if window_size % 2 == 0:
|
||||
window_size += 1
|
||||
|
||||
half_window = window_size // 2
|
||||
|
||||
# 创建输出图像
|
||||
|
||||
# 水域外区域设极小值(-1e9),使其落在百分位分布的最底部,不影响上分位数
|
||||
masked = img.astype(np.float32)
|
||||
masked[data_water_mask == 0] = -1e9
|
||||
|
||||
# 局部百分位数滤波 —— scipy C 级向量化,直接替代原来的双重 for 循环
|
||||
# size 支持单一整数(正方形窗口)
|
||||
local_thresh = percentile_filter(
|
||||
masked,
|
||||
percentile=percentile,
|
||||
size=window_size,
|
||||
mode='constant',
|
||||
cval=-1e9,
|
||||
)
|
||||
|
||||
# 二值化:原图像素 > 局部百分位阈值
|
||||
det_img = np.zeros_like(img, dtype=np.int32)
|
||||
|
||||
# 对每个像素计算局部阈值
|
||||
for i in range(half_window, height - half_window):
|
||||
for j in range(half_window, width - half_window):
|
||||
# 只在水域掩膜内处理
|
||||
if data_water_mask[i, j] == 0:
|
||||
continue
|
||||
|
||||
# 提取局部窗口
|
||||
local_window = img[i - half_window:i + half_window + 1,
|
||||
j - half_window:j + half_window + 1]
|
||||
local_mask = data_water_mask[i - half_window:i + half_window + 1,
|
||||
j - half_window:j + half_window + 1]
|
||||
|
||||
# 只考虑有效像素
|
||||
valid_pixels = local_window[local_mask > 0]
|
||||
|
||||
if len(valid_pixels) > 0:
|
||||
local_threshold = np.percentile(valid_pixels, percentile)
|
||||
if img[i, j] > local_threshold:
|
||||
det_img[i, j] = foreground
|
||||
|
||||
det_img[np.where(data_water_mask == 0)] = background
|
||||
|
||||
print(f"自适应阈值方法: 窗口大小={window_size}, 局部百分位数={percentile}%")
|
||||
|
||||
det_img[(img > local_thresh) & (data_water_mask > 0)] = foreground
|
||||
det_img[data_water_mask == 0] = background
|
||||
|
||||
n_glint = int(np.sum(det_img == foreground))
|
||||
print(f"自适应阈值方法 (scipy加速): 窗口大小={window_size}, "
|
||||
f"局部百分位数={percentile}%, 检测到耀斑像素={n_glint}")
|
||||
|
||||
return det_img
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user