用于遥感影像局部校正的处理方法

文档序号:6099076阅读:330来源:国知局

专利名称::用于遥感影像局部校正的处理方法
技术领域
:本发明涉及一种遥感影像的校正,具体说是一种用于遥感影像局部校正的处理方法。
背景技术
:卫星遥感影像的校正一直是遥感界十分关注和尚未完全解决的技术问题,特别是随着IKONOS、QUICKBIRD和SPOT5等高分辨率的卫星数据应用的不断深入,这一问题显得尤为突出。我们知道高空间分辨率卫星一般飞行高度都较低,所获取的数据容易受地形高差的影响,针对高分辨率卫星数据的正射校正,各种大的商业遥感软件都提出了各自的校正模型,其思路都是利用各种卫星平台参数,结合地面高程信息对影像进行校正,但仍无法实现影像数据和地形的完全配准,局部高差变化比较大的区域仍然存在偏差,常规的解决办法是将存在偏差的区域裁出再进行校正,而后再将校正后的子区补回去,这样做虽然可以勉强完成校正工作,但这样做一是操作相当烦琐,如果存在偏差的区域较多,这样做起来需要花费很长的时间;二是调整后的子区与原图像很难实现完好的拼接,局部存在线性条带或者数据缺失;所以常规方法很难真正完成遥感影像和真实地形的完全配准,无法满足实际的要求。技术方案本发明就是为了解决上述问题而提出的,本发明的目的在于提供一种操作简单、遥感影像和真实地形的完全配准的遥感影像局部校正的处理方法。为达到上述目的,本发明采用的技术方案为用于遥感影像局部校正的处理方法,其特殊之处在于所述的方法包括以下步骤(1)、图像输入到计算机内;(2)、对待校正影像和基准影像进行叠加显示;上述的叠加显示过程中,R波段为待调整数据,G、B波段为作为基准影像的波段;(3)、根据基准影像对待校正影像进行实时交互调整;上述的交互调整过程中,通过利用表面样条函数来实现实时交互调整,下面为对表面样条函数的描述用户在区域内通过鼠标拖拽可以确定像点调整前的N个控制点P1,P2,...,Pn的坐标(x1,y1),(x2,y2),...,(xn,yn)和调整后的坐标(x1’,y1’),(x2’,y2’),...,(xn’,yn’),在生成这一系列点(xi,yi)后,利用Goshtasby提出的表面样条函数拟合方法可以有效地解决控制点精确吻合的问题;f(x,y)=a0+a1x&prime;+a2y&prime;+&Sigma;i=1NFiri2lnri2]]>式中ri2=(x′-xi′)2+(y-yi′)2通过下面线性方程组求解N+3个参数α0,α1,α2,Fi,i=1,2,...,N,式中Fi满足下列条件&Sigma;i=1nFi=0,]]>&Sigma;i=1nxiFi=0,]]>&Sigma;i=1nyiFi=0]]>f(xj,yj)=a0+a1xj+a2yj+&Sigma;i=1NFirij2lnrij2]]>rij2=(xi-yj)2+(yi-yj)2,j=1,2,...,N,i&NotEqual;j]]>利用该函数可以保证用户给定的各点被准确调整到指定的位置,而其它的像元则相应的平滑调整,从而实现图像的完全配准。(4)、图像输出。上述过程的软件开发语言为面向矩阵的用于数据可视化研究与应用开发的高级语言,是第四代可视化开发语言IDL(InteractiveDataLanguage)。本发明相对于现有技术,其优点如下1、直观显示通过对待调整影像和作为基准的影像(或地形图)进行叠加显示,R波段为待调整数据的一个波段,G、B波段为作为基准的数据的波段。两幅数据中存在偏差的地方以重影显示,这样可以直观的发现哪些地方存在偏差,便于进行实时的调整。2、实时调整对存在重影的区域,只要划定一个调整范围(可以用矩形、圆形或者自定义多边形来进行划定),在范围内通过鼠标简单的拖拽就可以实现调整,形象的说就像拉橡皮筋一样的简单,鼠标拖拽的像点(待校正影像)精确地移动到基准影像对应的像点,而在范围内的其他点则根据与调整点的距离远近进行不同程度的调整,区域外的点则保持不动。调整后的结果实时的显示在操作窗口中,用户可以马上查看调整结果是否满意,以便于进行下一步的调整。3、局部调整调整的对象不是整幅影像,而是存在偏差的一个个局部区域。在做调整时只会影响到区域内的影像,而区域外的区域不会有任何影响。区域内的调整也是一个渐变的调整,离调整点越近的区域调整幅度越大,越接近调整边界的点调整幅度越小。4、操作简便整个设计思路在IDL上编程实现,生成了一个非常实用简便的工具。用户无需去利用大型的专业遥感软件来进行烦琐的操作,只要简单的几个操作步骤就可以完成整个校正过程。5、实用性强该技术可以应用到各种生产处理不同类型的影像数据,用户可以很简便的选择想要调整的数据子区,针对不同特征的重影,用户可以设定调整区域的大小,并可以对影像进行反复的调整。非常实用,具有很强的推广价值。图1为本发明的流程原理图;图2为本发明的具体流程图;图3为影像调整前,道路之间存在严重的偏差的效果图;图4为影像调整后,道路已经完全套合的效果图;图5为影像调整前,山脊线间存在重影的效果图;图6为影像调整后,山脊线间重影消失的效果图;具体实施方式在目前的生产实际中,高空间分辨率卫星由于飞行高度低,数据容易受地形高差的影响,特别是在海拔高度差异较大的山区,数据畸变尤为严重,所以高分辨率数据的正射校正为一个技术难题,目前通用的高分辨率卫星数据,如Ikonos、QuickBird和SPOT5数据,在进行正射校正方面,虽然各个大的图象处理软件都根据卫星的各种参数提出了校正模型,但在一些区域仍然完全与准确地形完全套合,存在局部偏差。另外SPOT5数据由于其多光谱波段和全色波段使用不同的传感器,致使在同一区域获得的数据难以完全套合,在数据的预处理中遇到了很多问题,特别是在做融合时,多光谱波段与全色波段难以配准,局部存在重影。为能消除影像数据中存在的局部偏差,在以标准数据作为基准的基础上,开发出一种能对其局部进行及时调整的处理方法。本发明突破传统的整体校正思路,从局部入手,对存在偏差的区域进行实时的交互式调整。首先将待校正的影像和作为基准的影像(或者地形图)进行叠加显示,这样就可以直观的看到哪些区域存在偏差,用户只需在存在偏差的区域划定一个调整范围,而后在范围内通过鼠标拖拽将待调整影像套合到基准影像(或者地形图)上,调整结果实时的反映出来,如果认为满意就将调整结果保存,如果觉得还不是很理想,你可以撤消本次调整,而后重新做调整。如此反复进行,直到得到一个理想的调整结果为止。在整个调整过程中,只是对选取范围内的图像进行调整,区域外的则没有任何影响。选取一块,调整一块,最终可以实现整幅图像与真实地形的完全套合。参见图1,图2,本发明的技术思路为用户选择输入待调整的图像和作为基准参考的图像、图形文件,作假彩色显示,用R波段为待调整数据的一个波段,G、B波段为作为基准的数据的波段,存在偏差的地方会出现重影,用户选择有重影的区域,通过鼠标拖拽待校正图像上的任一点到基准图像相应的点上,就实现了这两点完全配准,而区域内其他的点则跟着做不同程度的调整,离调整点越远变动幅度越小,区域边界则不做任何调整。当用户认为调整结果满意时,就保存并输出;否则继续调整,直到获得一个满意的校正结果。具体的开发步骤为第一步,首先,对该技术进行准确描述和界定。该技术的总体描述为对待校正影像和基准影像进行叠加显示,对存在重影的区域进行区域选择,而后在区域内利用鼠标拖拽来完成调整。该技术界定为常规校正方法的一个实用的补充。下面为该技术的总体框架。在整个技术框架中存在两个技术难点一是如何对两幅遥感影像进行叠加显示,在目前的商业遥感软件中均没有该功能;二是如何实现交互调整,这是整个技术的核心和难点。第一个难点可以通过IDL编程来实现,比较容易实现。而第二个难点则需要自己进行建模实现。针对如何实现交互调整,通过利用表面样条函数来实现核心模块的开发。下面为对表面样条函数的描述用户在区域内通过鼠标拖拽可以确定像点调整前的N个控制点P1,P2,...,Pn的坐标(x1,y1),(x2,y2),...,(xn,yn)和调整后的坐标(x1’,y1’),(x2’,y2’),...,(xn’,yn’),在生成这一系列点(xi,yi)后,利用Goshtasby提出的表面样条函数拟合方法可以有效地解决控制点精确吻合的问题。f(x,y)=a0+a1x&prime;+a2y&prime;+&Sigma;i=1NFiri2lnri2]]>式中ri2=(x′-xi′)2+(y-yi′)2通过下面线性方程组求解N+3个参数α0,α1,α2,Fi,i=1,2,...,N,式中Fi满足下列条件&Sigma;i=1nFi=0,]]>&Sigma;i=1nxiFi=0,]]>&Sigma;i=1nyiFi=0]]>f(xj,yj)=a0+a1xj+a2yj+&Sigma;i=1NFirij2lnrij2]]>rij2=(xi-yj)2+(yi-yj)2,j=1,2,...,N,i&NotEqual;j]]>利用该函数可以保证用户给定的各点被准确调整到指定的位置,而其它的像元则做一种平滑的调整,从而实现图像的完全协调。第二步是对整个技术流程进行编程实现。开发语言选择了第四代可视化开发语言IDL(InteractiveDataLanguage),该语言为面向矩阵的用于数据可视化研究与应用开发的高级语言,它在遥感图像处理方面提供了很多实用的函数,而该模块的核心其实是运用样条函数对矩阵数据的重新定位,所以利用该语言编程实现比较容易。具体的开发步骤为1、研究待调整影像和基准影像的假彩色叠加显示技术,并予以编程实现;2、研究并实施在遥感影像上各种边界选择方式(矩形选择、圆形选择和自定义多边形选择)的编程实现;3、研究模块的核心部分,对表面样条函数进行建模;4、对各个子模块进行整合,完成该模块的整体框架的搭建;5、编制使用说明,模块打包,完成整个模块的开发。在完成该技术的编程实现后,进行一系列的实用性测试。具体开发程序代码<prelisting-type="program-listing"><![CDATA[;definethecommonblocsprow_common_definecommonlittle_common,base,afid,apos,adims,bfid,bpos,bdims,$oimager,oimage,rimager,rimage,draw0,draw1,swin,win0,win1,zoom,image_size,$offset,order,retain,doEvents,WID_TEXT_0,button,sizer,$  datar,datag,datab,x0,x1,y0,y1,WID_BASE_12,mode,flag,xy_pnts,roinpts,roixy,$  drag,n,junk,xx0,xx1,yy0,yy1,cpnts,ncpnts,dcolor,data,ss,$  data1,data2,data3,oimage1,oimage2,oimage3,rimage1,rimage2,riage3,$  fname,data_type,ns,nl,nb,interleave,scrollx,scrolly,imagex,imageyend;---------------------------------------------;---------------------------------------------;AddcornersandReturnsthenumberofcornerpoints(nn).prow_peopleCorners,nncommonlittle_common  ss=(size(roixy))[2]  fori=0,ss-1docpnts[*,i+ncpnts]=[roixy,roixy[1,i],roixy,roixy[1,i]]  nn=ncpnts+ss  ix=(!d.x_size-1)*  iy=(!d.y_size-1)*  fori=0,3docpnts=[ix[i],iy[i],ix[i],iy[i]]  nn=nn+3end;--------------------------------------------------;--------------------------------------------------;SetnewmodeandcleantheoldroiproW_CW_DEFROI_nmode,newcommonlittle_commonW_CW_DEFROI_DRAW,-1roinpts=0W_CW_DEFROI_DRAW,-1mode=newend;----------------------------------------------;----------------------------------------------;DrawtheoutlinePROW_CW_DEFROI_DRAW,icommonlittle_commonn=roinptsifnlt1thenreturnWSET,win1DEVICE,SET_GRAPHICS=6col=255WIDGET_CONTROL,xy_pnts,GET_UVALUE=xy,/NO_COPYxsave=!x.s&amp;ysave=!y.sp=float([!d.x_size,!d.y_size])f=/pq=[1,1]/p!x.s=[f,q]!y.s=[f[1],q[1]]ifnge2thenbegin  ifilt0thenplots,THICK=1.5,COLOR=col,xy[*,0:n-1]+.5$  elseplots,THICK=1.5,COLOR=col,xy[*,i:i+1]+.5ENDIFEMPTY!x.s=xsave&amp;!y.s=ysaveWIDGET_CONTROL,xy_pnts,SET_UVALUE=xy,/NO_COPYDEVICE,SET_GRAPHICS=3end;----------------------------------------------;----------------------------------------------;maineventhandlerprow_little_rectify_event,seventcommonlittle_common;Quittheapplicationusingthecloseboxif(TAG_NAMES(sEvent,/STRUCTURE_NAME)EQ$  ′WIDGET_KILL_REQUEST′)thenbegin  WIDGET_CONTROL,sEvent.top,/DESTROY  RETURNendif;inthescrollimagewindowif(sEvent.idEQdraw0)thenbegin  WIDGET_CONTROL,WID_TEXT_0,SET_VALUE=string(sevent.x,sevent.y,format=′("坐标:",i,",",i)′)  if((sEvent.pressAND1)NE0)thenbegin  roinpts=0  W_CW_DEFROI_DRAW,-1  widget_control,junk,sensitive=1  widget_control,WID_BASE_12,sensitive=0  flag=0  ncpnts=0  cpnts[*,*]=0  if(sizer[1]gesizer[2])thenrate=sizer[1]/256elserate=sizer[2]/256  centerx=fix(sevent.x*rate)  centery=fix((256-sevent.y)*rate)  x0=centerx-299  x1=centerx+300  y0=centery-299  y1=centery+300  ifx0le0thenbegin  x0=0  x1=599  endif  if(x1gesizer[1])thenbegin  x0=sizer[1]-600  x1=sizer[1]-1  endif  ify0le0thenbegin  y0=0  y1=599  endif  if(y1gesizer[2])thenbeginx=sevent.xy=sevent.yifsEvent.pressne0thendrag=[x,y]ifsevent.presseq1thenbutton=1ifsevent.releaseeq1thenbutton=0IF(modeeq1)or(modeeq2)thenbegin  ifbuttonthenbegin  ifngt0thenW_CW_DEFROI_draw,-1  t=drag  ifmodeeq1thenbegin  n=5  xy=[[t],[x,t[1]],[x,y],[t,y],[t]]  roixy=xy[*,0:3]  endifelsebegin  n=30  a=findgen(n+1)*(2*!pi/(n-1))  r=sqrt((float(x)-t)^2+(float(y)-t[1])^2)  xy=transpose([[t+r*cos(a)],[t[1]+r*sin(a)]])  roixy=fix(xy[*,0:28])  endelse  WIDGET_CONTROL,xy_pnts,SET_UVALUE=xy,/NO_COPY  roinpts=n  W_CW_DEFROI_draw,-1  endifreturnENDIFif(sEvent.presseq0)thenreturnWIDGET_CONTROL,xy_pnts,GET_UVALUE=xy,/NO_COPYifn_elements(xy)le1thenxy=intarr(2,100)ifngt0thenifxeqxyandyeqxy[1,n-1]then$  WIDGET_CONTROL,xy_pnts,SET_UVALUE=xy,/NO_COPYif(n+1)gen_elements(xy)/2thenxy=[[xy],[intarr(2,n)]]xy=xxy[1,n]=yn=n+1roinpts=nroixy=xy[*,0:n-1]y0=sizer[2]-600  y1=sizer[2]-1  endif  ;displayimageintheoriginalimagewindow  wset,win1  erase  oimager=datar[x0:x1,y0:y1]  oimageg=datag[x0:x1,y0:y1]  oimageb=datab[x0:x1,y0:y1]  oimage[*,*,0]=oimager  oimage[*,*,1]=oimageg  oimage[*,*,2]=oimageb  rimager=oimager  rimage=oimage  tv,oimage,true=3,order=order  ifnbge2thenbegin  oimage1=data1[x0:x1,y0:y1]  rimage1=oimage1  endif  ifnbge3thenbegin  oimage2=data2[x0:x1,y0:y1]    rimage2=oimage2  endif  ifnbge4thenbegin  oimage3=data3[x0:x1,y0:y1]  rimage3=oimage3  endif  endif  returnendif;intheoriginalinagewindowif(sEvent.idEQdraw1)thenbegin  wset,win1  WIDGET_CONTROL,WID_TEXT_0,SET_VALUE=string(sevent.x,sevent.y,format=′("坐标:",i,",",i)′)  ;detectifdorectifing  ifflageq0thenbegin  if(sevent.xlt0)or(sevent.ylt0)or$  (sevent.xge599)or(sevent.yge599)thenreturnWIDGET_CONTROL,xy_pnts,SET_UVALUE=xy,/NO_COPY  ifmodeeq0thenbegin  ifnge2then$  W_CW_DEFROI_draw,n-2  endifelsebegin  W_CW_DEFROI_draw,n-1  endelse  returnendifelsebegin  dcolor=255;inthelittlerectifymodule;Handlebuttonpress.  if((sEvent.pressAND1)NE0)thenbegin  if(buttonEQ1)thenRETURN  DEVICE,SET_GRAPHICS=6  xx1=(xx0=sEvent.x)  yy1=(yy0=sEvent.y)  button=1  RETURN  endif  ;Handlebuttonrelease.  if((sEvent.releaseand1)NE0)thenbegin  PLOTS,[xx0,xx1],[yy0,yy1],COLOR=dcolor,/DEVICE  arrow,xx0,yy0,xx1,yy1,COLOR=dcolor  DEVICE,SET_GRAPHICS=3  button=0  ;将每次的调整值记录在数组cpnts中  cpnts=[xx0,yy0,xx1,yy1]  ncpnts=ncpnts+1  ;将图象的角点存入数组cpnts中,并计算参与运算的角点个数  w_peopleCorners,nn  ;设置显示的桢数,这里设置为2  nframes=2  ;调用三角网校正模型进行校正  cpx=cpnts  cpy=cpnts[1,ncpnts-1:nn]x=cpnts[2,ncpnts-1:nn]  y=cpnts[3,ncpnts-1:nn]  rimager=WARP_TRI(x,600-y,cpx,600-cpy,rimager)  ifnbge2thenrimage1=WARP_TRI(x,600-y,cpx,600-cpy,rimage1)  ifnbge3thenrimage2=WARP_TRI(x,600-y,cpx,600-cpy,rimage2)  ifnbge4thenrimage3=WARP_TRI(x,600-y,cpx,600-cpy,rimage3)  rimage[*,*,0]=rimager  tv,rimage,true=3,order=order  W_CW_DEFROI_draw,-1  RETURN  endif  ;Handlebuttonmotion.  if(button)thenbegin  PLOTS,[xx0,xx1],[yy0,yy1],COLOR=dcolor,/DEVICE  xx1=sEvent.x>0<(!dx_size-1)  yy1=sEvent.y>0<(!d.y_size-1)  PLOTS,[xx0,xx1],[yy0,yy1],COLOR=dcolor,/DEVICE  RETURN  endif  RETURN  endelsereturnendifelsebegin  WIDGET_CONTROL,sEvent.top,/HOURGLASS  WIDGET_CONTROL,sEvent.id,GET_UVALUE=b  if(bEQ′CW′)thenb=sEvent.value  casebof  ′打开...′:begin  ENVI_SELECT,fid=afid,pos=apos,dims=adims,/file_only,title=′选择待调整影像文件′  if(afideq-1)thenreturn  ENVI_FILE_QUERY,afid,ns=ns,nl=nl,nb=nb,$  fname=fname,data_type=data_type,$  interleave=interleave,offset=offset  ;readtheoriginalimagebandsintovariables  datar=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos)  ifnbge2thendata1=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos[1])  ifnbge3thendata2=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos[2])  ifnbge4thendata3=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos[3]);computetheXandYsizeofthescrollimagewindowsizer=size(datar)ifsizer[1]eqsizer[2]thenbegin  scrollx=256  scrolly=256endifelsebeginifsizer[1]gesizer[2]thenbegin  scrollx=256  scrolly=fix(sizer[2]/(sizer[1]/256))endifelsebegin  scrollx=fix(sizer[1]/(sizer[2]/256))  scrolly=256endelseendelse;computetheXandYsizeoftheoriginalimagewindowimagex=600imagey=600ifsizer[1]le600thenimagex=sizer[1]ifsizer[2]le600thenimagey=sizer[2];selectthebaseimageENVI_SELECT,fid=bfid,pos=bpos,dims=bdims,/band_only,title=′选择基准影像′if(bfideq-1)thenreturndatab=(datag=ENVI_GET_DATA(fid=bfid,dims=bdims,pos=bpos))SWIN=!D.WINDOW;displaythescrollimagesimager=congrid(datar,scrollx,scrolly)simageg=congrid(datag,scrollx,scrolly)simageb=congrid(datab,scrollx,scrolly)simage=intarr(scrollx,scrolly,3)simage[*,*,0]=simagersimage[*,*,1]=simagegsimage[*,*,2]=simagebwset,win0TV,simage,true=3,order=order;displaytheoriginalimagewset,win1oimager=dataroimageg=datagoimageb=databoimage=intarr(imagex,imagey,3)oimage[*,*,0]=oimageroimage[*,*,1]=oimagegoimage[*,*,2]=oimagebtv,oimage,true=3,order=orderrimager=oimagerrimage=oimageifnbge2thenbegin  oimage1=data1  rimage1=oimage1  endif  ifnbge3thenbegin  oimage2=data2  rimage2=oimage2  endif  ifnbge4thenbegin  oimage3=data3  rimage3=oimage3  endif  WSET,SWINendcase′保存′:begin  openw,lun,fname,/get_lun  writeu,lun,datar  ifnbge2thenwriteu,lun,data1  ifnbge3thenwriteu,lun,data2  ifnbge4thenwriteu,lun,data3  free_lun,lun  envi_setup_head,fname=fname,ns=ns,nl=nl,nb=nb,$  data_type=data_type,offset=offset,interleave=interleave,/write,/open  ;envi_tile_done,tile_idendcase′另存为...′:begin  outfile=Dialog_Pickfile(Path=current,/NoConfirm,Get_Path=path,Filter=[′*.*′],$  title=′文件另存为...′)  IFoutfileNE"THENBEGIN  openw,lun,outfile,/get_lun  writeu,lun,datar  ifnbge2thenwriteu,lun,data1  ifnbge3thenwriteu,lun,data2ifnbge4thenwriteu,lun,data3  free_lun,lun  envi_setup_head,fname=outfile,ns=ns,nl=nl,nb=nb,$  datatype=data_type,offset=offset,interleave=interleave,/write,/open  ENDIFendcase′多边形选择′:W_CW_DEFROI_nmode,0′矩形选择′:W_CW_DEFROI_nmode,1′圆形选择′:W_CW_DEFROI_nmode,2′范围选择′:begin  widget_control,junk,sensitive=1  widget_control,WID_BASE_12,sensitive=0  flag=0  widget_control,junk,SET_VALUE=0  W_CW_DEFROI_nmode,0endcase′影像微调′:begin  widget_control,junk,sensitive=0  widget_control,WID_BASE_12,sensitive=1  flag=1endcase′调整′:begin  datar[x0:x1,y0:y1]=imager  ifnbge2thendata1[x0:x1,y0:y1]=rimage1  ifnbge3thendata2[x0:x1,y0:y1]=rimage2  ifnbge4thendata3[x0:x1,y0:y1]=rimage3endcase′撤消′:begin  if(ncpntsEQ0)thenreturn  ;对最近的调整结果进行反向调整  nn=ncpnts+3+ss  cpx=cpnts  cpy=cpnts[1,ncpnts-1:nn]  x=cpnts[2,ncpnts-1:nn]  y=cpnts[3,ncpnts-1:nn]  rimager=WARP_TRI(cpx,600-cpy,x,600-y,rimager)  ifnbge2thenrimage1=WARP_TRI(cpx,600-cpy,x,600-y,rimage1)  ifnbge3thenrimage2=WARP_TRI(cpx,600-cpy,x,600-y,rimage2)  ifnbge4thenrimage3=WARP_TRI(cpx,600-cpy,x,600-y,rimage3)  rimage[*,*,0]=rimager  tv,rimage,true=3,order=order  W_CW_DEFROI_draw,-1;对数组cpnts进行更新  fori=ncpnts,nndocpnts=cpnts  cpnts=  ncpnts=ncpnts-1  endcase  ′重置′:begin  tv,oimage,true=3,order=order  W_CW_DEFROI_DRAW,-1  rimager=oimager  ifnbge2thenrimage1=oimage1  ifnbge3thenrimage2=oimage2  ifnbge4thenrimage3=oimage3  rimage=oimage  fori=0,ncpnts-1dobegin  cpnts=  endfor  ncpnts=0  endcase  ′退出′:WIDGET_CONTROL,sEvent.top,/DESTROY  ′关于littlerectify′:begin  spawn,′D:\RSI\IDL60\products\envi40\save_add\text\help.doc′,/hide  ;spawn,′C:\WINNT\clock.avi′,/hide  endcaseendcaseendelseend;----------------------------------------------------------;----------------------------------------------------------;PurposeCleanupprocedure.Prow_little_rectify_cleanup,wTopBase  WIDGET_CONTROL,wTopBase,GET_UVALUE=sState,/No_Copy  TVLCT,sState.previouscolorTable  commonlittle_common  oimager=0  oimage=0end;----------------------------------------------------------;----------------------------------------------------------;mainproceduredefineprow_little_rectify,eventcommonlittle_commongroup=0L;initialassociatedvriableRETAIN=2button=0order=1mode=0flag=0roinpts=0Ln=0drag=ncpnts=0cpnts=fltarr(4,100);selecttheoriginalimagetorectifyENVI_SELECT,fid=afid,pos=apos,dims=adims,/file_only,title=′选择待调整影像文件′if(afideq-1)thenreturnENVI_FILE_QUERY,afid,ns=ns,nl=nl,nb=nb,$fname=fname,data_type=data_type,$interleave=interleave,offset=offset;readtheoriginalimagebandsintovariablesdatar=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos)ifnbge2thendata1=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos[1])ifnbge3thendata2=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos[2])ifnbge4thendata3=ENVI_GET_DATA(fid=afid,dims=adims,pos=apos[3]);computetheXandYsizeofthescrollimagewindowsizer=size(datar)ifsizer[1]eqsizer[2]thenbegin  scrollx=256  scrolly=256endifelsebegin  ifsizer[1]gesizer[2]thenbegin  scrollx=256  scrolly=fix(sizer[2]/(sizer[1]/256))endifelsebegin  scrollx=fix(sizer[1]/(sizer[2]/256))  scrolly=256  endelseendelse;computetheXandYsizeoftheoriginalimagewindowimagex=600imagey=600ifsizer[1]le600thenimagex=sizer[1]ifsizer[2]le600thenimagey=sizer[2];selectthebaseimageENVI_SELECT,fid=bfid,pos=bpos,dims=bdims,/band_only,title=′选择基准影像′if(bfideq-1)thenreturndatab=(datag=ENVI_GET_DATA(fid=bfid,dims=bdims,pos=bpos))SWIN=!D.WINDOW;GetthecurrentcolortableTVLCT,savedR,savedG,savedB,/GETpreviousColorTable=[[savedR],[savedG],[savedB]];Createthewidgetsbase=Widget_Base(GROUP_LEADER=wGroup,UVALUE=′base′$  ,XOFFSET=50,YOFFSET=50,SCR_XSIZE=890,SCR_YSIZE=660$  ,TITLE=′littlerectify′,SPACE=3,XPAD=3,YPAD=3$  ,TLB_FRAME_ATTR=1,MBAR=base_MBAR)WID_BASE_1=Widget_Base(base,UVALUE=′WID_BASE_1′,XOFFSET=6$  ,YOFFSET=2,SCR_XSIZE=260,SCR_YSIZE=330,TITLE=′IDL′,SPACE=3$  ,XPAD=3,YPAD=3,frame=1)WID_BUTTON_21=Widget_Button(WID_BASE_1,UVALUE=′范围选择′$  ,XOFFSET=12,YOFFSET=6,SCR_XSIZE=106,SCR_YSIZE=25$  ,/ALIGN_CENTER,VALUE=′范围选择′)WID_BUTTON_13=Widget_Button(WID_BASE_1,UVALUE=′影像微调′$  ,XOFFSET=132,YOFFSET=6,SCR_XSIZE=106,SCR_YSIZE=25$  ,/ALIGN_CENTER,VALUE=′影像微调′)WID_BASE_6=Widget_Base(WID_BASE_1,UVALUE=′WID_BASE_6′,FRAME=1$  ,XOFFSET=14,YOFFSET=40,SCR_XSIZE=227,SCR_YSIZE=100$  ,TITLE=′IDL′,SPACE=3,XPAD=3,YPAD=3)junk=CW_BGROUP(WID_BASE_6,/column,/EXCLUSIVE,/NO_REL,/RETURN_NAME,UVALUE=CW′,$  [′多边形选择′,′矩形选择′,′圆形选择′],SET_VALUE=0,XOFFSET=3,YOFFSET=6)WID_BASE_12=Widget_Base(WID_BASE_1,UVALUE=′WID_BASE_12′,FRAME=1$  ,XOFFSET=14,YOFFSET=148,SCR_XSIZE=227,SCR_YSIZE=75$  ,TITLE=′IDL′,SPACE=3,XPAD=3,YPAD=3,sensitive=0)WID_BUTTON_14=Widget_Button(WID_BASE_12,UVALUE=′调整′$  ,XOFFSET=24,YOFFSET=11,SCR_XSIZE=76,SCR_YSIZE=22$  ,/ALIGN_CENTER,VALUE=′调整′)WID_BUTTON_18=Widget_Button(WID_BASE_12,UVALUE=′撤消′$  ,XOFFSET=123,YOFFSET=11,SCR_XSIZE=76,SCR_YSIZE=22$  ,/ALIGN_CENTER,VALUE=′撤消′)WID_BUTTON_19=Widget_Button(WID_BASE_12,UVALUE=′退出′$  ,XOFFSET=122,YOFFSET=40,SCR_XSIZE=76,SCR_YSIZE=22$  ,/ALIGN_CENTER,VALUE=′退出′)WID_BUTTON_20=Widget_Button(WID_BASE_12,UVALUE=′重置′$  ,XOFFSET=23,YOFFSET=40,SCR_XSIZE=76,SCR_YSIZE=22$  ,/ALIGN_CENTER,VALUE=′重置′)WID_TEXT_0=Widget_Text(WID_BASE_1,UVALUE=′WID_TEXT_0′,FRAME=1$  ,XOFFSET=15,YOFFSET=238,SCR_XSIZE=229,SCR_YSIZE=26,VALUE=[$  ′当前坐标:′],XSIZE=20,YSIZE=1)xy_pnts=Widget_Text(WID_BASE_1,UVALUE=0,XOFFSET=15$  ,YOFFSET=270,SCR_XSIZE=229,SCR_YSIZE=56,VALUE=[$  ′请先进行调整范围选择,而后点击′,′‘影像微’调按扭进行调整!′]$  ,XSIZE=20,YSIZE=8);initialthedrawwidgetdoEvents=(retaineq20:1)if(sizereq0)thendoEvents=0WID_BASE_2=Widget_Base(base,UVALUE=′WID_BASE_2′,FRAME=1$  ,XOFFSET=276,YOFFSET=1,SCR_XSIZE=604,SCR_YSIZE=604$  ,TITLE=′IDL′,SPACE=3,XPAD=3,YPAD=3)draw1=Widget_Draw(WID_BASE_2,retain=retain,XOFFSET=1,YOFFSET=1,UVALUE=′draw1′$  ,SCR_XSIZE=imagex,SCR_YSIZE=imagey,$expose_events=doEvents,viewport_events=doEvents,/MOTION_EVENTS,/BUTTON_EVENTS)WID_BASE_4=Widget_Base(base,UVALUE=′WID_BASE_4′,FRAME=1$  ,XOFFSET=6,YOFFSET=335,SCR_XSIZE=260,SCR_YSIZE=260$  ,TITLE=′IDL′,SPACE=3,XPAD=3,YPAD=3)draw0=Widget_Draw(WID_BASE_4,retain=retain,UVALUE=′draw0′,XOFFSET=1$  ,YOFFSET=1,XSIZE=scrollx,YSIZE=scrolly,expose_events=doEvents,/MOTION_EVENTS,/BUTTON_EVENTS);definethemenuofbasewidgetW_MENU_0=Widget_Button(base_MBAR,UVALUE=′W_MENU_0′,/MENU,VALUE=′文件′)W_MENU_3=Widget_Button(W_MENU_0,UVALUE=′打开...',VALUE=′打开...′)W_MENU_9=Widget_Button(W_MENU_0,UVALUE=′保存′,VALUE=′保存′,/separator)W_MENU_11=Widget_Button(W_MENU_0,UVALUE=′另存为...′,VALUE=′另存为...′)W_MENU_10=Widget_Button(W_MENU_0,UVALUE=′退出′,/SEPARATOR,VALUE=′退出′)W_MENU_12=Widget_Button(base_MBAR,UVALUE=′W_MENU_12′,/MENU,VALUE=′帮助′)W_MENU_13=Widget_Button(W_MENU_12,UVALUE=′关于littlerectify′,VALUE=′关于littlerectify′)Widget_Control,/REALIZE,baseWIDGET_CONTROL,draw0,GET_VALUE=win0WIDGET_CONTROL,draw1,GET_VALUE=win1;displaythescrollimagesimager=congrid(datar,scrollx,scrolly)simageg=congrid(datag,scrollx,scrolly)simageb=congrid(datab,scrollx,scrolly)simage=intarr(scrollx,scrolly,3)simage[*,*,0]=simagersimage[*,*,1]=simagegsimage[*,*,2]=simagebwset,win0TV,simage,true=3,order=order;displaytheoriginalimagewset,win1oimager=dataroimageg=datagoimageb=databoimage=intarr(imagex,imagey,3)oimage[*,*,0]=oimageroimage[*,*,1]=oimagegoimage[*,*,2]=oimagebtv,oimage,true=3,order=orderrimager=oimagerrimage=oimageprint,nbifnbge2thenbegin  oimage1=data1  rimage1=oimage1endififnbge3thenbegin  oimage2=data2  rimage2=oimage2endififnbge4thenbegin  oimage3=data3  rimage3=oimage3endifWSET,SWIN;CreatethestatestructuresState={previousColorTable:previousColorTable,$  groupBase:group}WIDGET_CONTROL,base,SET_UVALUE=sState,/NO_COPYXManager,′w_little_rectify′,base,EVENT_HANDLER=′w_little_rectify_event′,$  CLEANUP=′w_little_rectify_cleanup′,/NO_BLOCKend]]></pre>参见图3、图4、图5、图6,本发明选取的试验数据为SPOT5多光谱数据和全色数据这两种数据,由于这两种数据为不同的传感器所获取,在做数据融合时很难实现完全套合,下面为使用该技术进行校正的结果和原始数据的比较的。权利要求1.用于遥感影像局部校正的处理方法,其特征在于所述的方法包括以下步骤(1)、图像输入到计算机内;(2)、对待校正影像和基准影像进行叠加显示;上述的叠加显示过程中,R波段为待调整数据,G、B波段为作为基准影像的波段;(3)、根据基准影像对待校正影像进行实时交互调整;上述的交互调整过程中,通过利用表面样条函数来实现实时交互调整,下面为对表面样条函数的描述用户在区域内通过鼠标拖拽可以确定像点调整前的N个控制点P1,P2,...,Pn的坐标(x1,y1),(x2,y2),...,(xn,yn)和调整后的坐标(x1’,y1’),(x2’,y2’),...,(xn’,yn’),在生成这一系列点(xi,yi)后,利用Goshtasby提出的表面样条函数拟合方法可以有效地解决控制点精确吻合的问题;f(x,y)=a0+a1x&prime;+a2y&prime;+&Sigma;i=1NFiri2lnri2]]>式中ri2=(x′-xi′)2+(y-yi′)2通过下面线性方程组求解N+3个参数α0,α1,α2,Fi,i=1,2,...,N,式中Fi满足下列条件&Sigma;i=1nFi=0,&Sigma;i=1nxiFi=0,&Sigma;i=1nyiFi=0]]>f(xj,yj)=a0+a1xj+a2yj+&Sigma;i=1NFirij2lnrij2]]>rij2=(xi-yi)2+(yi-yi)2]]>j=1,2,...,Ni≠j利用该函数可以保证用户给定的各点被准确调整到指定的位置,而其它的像元则相应的平滑调整,从而实现图像的完全配准。(4)、图像输出。2.根据权利要求1所述的用于遥感影像局部校正的处理方法,其特征在于上述过程的软件开发语言为面向矩阵的用于数据可视化研究与应用开发的高级语言,是第四代可视化开发语言IDL(InteractiveDataLanguage)。全文摘要本发明涉及一种以航天、航空遥感图像作为主要信息源,调整常规假彩色合成中图像色彩失真的处理方法。在现有技术中,一般都有相应的色彩调整模块,这些模块都是依据图像统计特征进行的,在使用多景图像制作镶嵌图时,要把不同季节的图像色彩调整一致,并且保持各类地物本色几乎不可能。本发明的是研究图像上地物的光谱特征,寻找各类主要地物在光谱特征上的差异;然后量化和比较特征差异,用逻辑表达式描述这种差异,建立相互关系数学模型,通过输入这些模型,用于自动识别需要调整目标,根据彩色原理,调整目标象元的相应数值,重点调整水体、植被等,达到改变视觉效果,达到乱真的目的,同时保证其它地物的色彩不变,使得合成图像逼近自然色彩。文档编号G01S7/48GK1831555SQ20051004178公开日2006年9月13日申请日期2005年3月10日优先权日2005年3月10日发明者王政伟,万余庆申请人:中国煤炭地质总局航测遥感局
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1