小韩同学在研究清晰度,要实现这个算法。于是写出来了和大家分享。
清晰度是图像细节边缘变化的敏锐程度。在图像细节的边缘处,光学密度或亮度随位置的变化越敏锐(变化快)、越剧烈(反差大),则细节的边缘就越清晰,可辨程度越高。其计算公式可采用改进后的点锐 度法【8】来表示: 式中:M、N分别为图像的行数和列数,df为灰度变化幅值,dx为像元间的距离增量,a表示像素i周围的像素数。
PRO Articulation
COMPILE_OPT idl2
ENVI, /restore_base_save_files
envi_batch_init
infile = DIALOG_PICKFILE(title = '请选择要打开的文件:')
ENVI_OPEN_FILE, infile, r_fid=fid
IF (fid EQ -1) THEN BEGIN
ENVI_BATCH_EXIT
RETURN
ENDIF
;获取数据的基本信息
ENVI_FILE_QUERY, fid, dims=dims, nb=nb ,nl=nl,ns=ns
proj = ENVI_GET_PROJECTION(FID = fid,pixel_size=Dx)
print,dx
dx=dx[0]
; data1 = MAKE_ARRAY(nl,ns)
FOR g=0,nb-1 DO BEGIN
data1 = ENVI_GET_DATA(DIMS=dims, FID=fid , POS=g)
;
;;清晰度的计算
;
Den = nl*ns
FOR i =1,nl-2 DO BEGIN
FOR j = 1,ns-2 DO BEGIN
;获取一个3*3的窗口
t= data1[[i-1]:[i+1],[j-1]:[j+1]]
; help,t
;对每个窗口做计算
d1=ABS((t[0,0]-t[1,1])/(Dx*1.414))
d2=ABS(t[0,1]-t[1,1])/Dx*1.0
d3=ABS(t[0,2]-t[1,1])/(Dx*1.414)
d4=ABS(t[1,0]-t[1,1])/Dx*1.0
d5=ABS(t[1,2]-t[1,1])/Dx*1.0
d6=ABS(t[2,0]-t[1,1])/(Dx*1.414)
d7=ABS(t[2,1]-t[1,1])/Dx*1.0
d8=ABS(t[2,2]-t[1,1])/(Dx*1.414)
;计算每个窗口的df/dx
dd=d1+d2+d3+d4+d5+d6+d7+d8
;
ENDFOR
ENDFOR
outdata2 = dd/Den
;输出每个波段图像的清晰度
PRINT,outdata2
ENDFOR
END
个人觉得这个代码的优点在于:
1、三窗口矩阵的获取,(----多窗口的获取)
2、获取后指定一变量t,关于矩阵内部的运算直接针对t就行了,这样避免了操作窗口时数组下标混乱。