IDL快速计算局部标准差——卷积⽅法(矩阵运算)
矩阵运算,局部标准差!
IDL这个语⾔中常规计算局部标准差的⽅法都是采⽤双循环的⽅式,本⼈提出⼀种矩阵计算得到不同尺⼨的“滑块”的标准差(3×3、5×5、7×7等都可以实现),话不多说直接上代码,代码中有详细的说明注释。
下⾯的函数是⽤来计算局部标准差:
FUNCTION uniformity_convol_method, raw_data, filter_h, filter_w, invalid_value
;raw_data 是原始的⼆维数组
;fileter_h 是滑块的⾼度
;filter_w 是滑块的宽度
; invalid_value 是数据中的⽆效值、空值等,根据需要其是否参与计算
;函数返回⼀个与初始矩阵⼤⼩相同的,标准差矩阵
w = N_ELEMENTS(raw_data[*,0])
h = N_ELEMENTS(raw_data[0,*])
im = raw_data
im2 = im^2
ones = REPLICATE(1.0, w, h);初始化⼀个全1数组,辅助运算
ids_invalid = WHERE(im EQ invalid_value, count_ids_invalid)
IF count_ids_invalid GT 0 THEN ones[ids_invalid]= invalid_valueinvalids
kernel = REPLICATE(1.0, filter_h, filter_w);设定卷积核的⼤⼩(和滑块⼤⼩相同)
;这⾥的运算涉及到⼀些线性代数计算,不懂的可以查阅相关资料
s = CONVOL(im, kernel,/CENTER,/EDGE_ZERO, _EXTRA=extra, INVALID=invalid_value)
s2 = convol(im2, kernel,/CENTER,/EDGE_ZERO, _EXTRA=extra, INVALID=invalid_value^2)
ns = convol(ones, kernel,/CENTER,/EDGE_ZERO, _EXTRA=extra, INVALID=invalid_value)
result = sqrt(abs((s2 - s^2/ ns)/(ns -1.0)))
RETURN, result
END
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论