分享

日志 [2010年08月12日]利用IDL+ENVI实现影像清晰度计算

 米木十一 2011-09-23
小韩同学在研究清晰度,要实现这个算法。于是写出来了和大家分享。

      清晰度是图像细节边缘变化的敏锐程度。在图像细节的边缘处,光学密度或亮度随位置的变化越敏锐(变化快)、越剧烈(反差大),则细节的边缘就越清晰,可辨程度越高。其计算公式可采用改进后的点锐 度法【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就行了,这样避免了操作窗口时数组下标混乱。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多