【IDL】同時顯示不同解析度影像的方法

地理遥感生态网平台發表於2024-06-28

問題:兩個影像解析度不一致的時候,如何正確的同時進行顯示呢。

分析:做一個假設,假設兩幅圖的地理座標範圍一致,影像解析度不一致,影像的畫素尺寸也不一致,那麼顯示的時候就不能以影像的畫素尺寸為準了,需要考慮影像的地理座標範圍。這也是正確的顯示多幅帶地理座標的影像所要考慮的內容。

解決:問題歸結到顯示座標系上,IDL中的座標系分影像座標系、歸一化座標系、資料座標系三種。如果需要兩幅圖正確的顯示在一起,那麼需要統一到同一座標系下。

下面以顯示IDL自帶的兩個影像檔案(全球範圍)為例,分別按原始影像座標(顯示不匹配)、特定資料範圍座標(顯示匹配)和歸一化座標(顯示匹配)進行了顯示。

示例程式碼:

PRO TEST_DPIO
  ;

  oWindow = OBJ_NEW('IDLgrWindow', $

   retain =2, $

   title ='原始影像座標顯示',$

   DIMENSIONS = [1024,512])

   

  ; 設定顯示區域座標為歸一化座標

  oView = OBJ_NEW('IDLgrView', viewPlane_Rect = [0,0,1,1])

 

  imageModel1 = OBJ_NEW('IDLgrModel')

  imageModel2= OBJ_NEW('IDLgrModel')

  oTopModel= OBJ_NEW('IDLgrModel')

 oTopModel->ADD,[imageModel1,imageModel2]

  ;    物件顯示體系結構示意圖

  ;         oView

  ;           |

  ;      oTopModel

  ;         /  \

  ;        /    \

  ;   imaeModel1 imageModel2

 oView->ADD,oTopModel

 

  ;讀取影像檔案資料

  file1 = filepath( 'day.jpg', SUBDIRECTORY=['examples','data'] )

  read_jpeg,file1,data1

  ;影像大小

  help,data1

  file2 = filepath( 'avhrr.png', SUBDIRECTORY=['examples','data'] )

  data2 = READ_PNG(file2,r,g,b)

  ;影像大小

  help,data2

  ;建立影像物件

  oImage1 = OBJ_NEW('IDLgrImage', $

   data1)

 imageModel1->ADD,oImage1

 

  ;建立顏色表物件

  oPalette = OBJ_NEW('IDLgrPalette',r,g,b)

  ;建立影像物件

  oImage2 = OBJ_NEW('IDLgrImage', $

   PALETTE  = oPalette,$

   data2)

 imageModel2->ADD,oImage2

 

  ;影像座標顯示

 oView->SETPROPERTY, viewPlane_Rect = [0,0,1024,512]

  ;閃爍顯示

  FOR i=0,6 DO BEGIN

   wait,0.5

   oImage2->SETPROPERTY,hide =(i MOD 2)

   oWindow->DRAW,oView

  ENDFOR

  ;

  ;方法1 -----設定image2的顯示範圍為image1的範圍

  ;如顯示地理座標資料一般採取此方法

  ;

 oView->SETPROPERTY,viewPlane_Rect  = [-100,-50,1224,612]

 oWindow->SETPROPERTY,title ='特定座標範圍顯示'

  queryStatus = QUERY_IMAGE(file1, imageInfo)

 oImage2->SETPROPERTY,dimension = imageInfo.DIMENSIONS

  ;閃爍顯示

  FOR i=0,6 DO BEGIN

   wait,0.5

   oImage2->SETPROPERTY,hide =(i MOD 2)

   oWindow->DRAW,oView

  ENDFOR

  ;

  ;

  ;方法2 -----兩個影像不管大小,全部均一化顯示

  ;

  Obj_Destroy,oImage2

  ;建立影像物件

  oImage2 = OBJ_NEW('IDLgrImage', $

   PALETTE  = oPalette,$

   data2)

 imageModel2->ADD,oImage2
 

  ;獲取當前影像物件的X、Y方向的範圍

 oImage1->GETPROPERTY, xRange = xRange,yRange = yRange

  ;求出歸一化係數

  xr = NORM_COORD(xRange)

  yr = NORM_COORD(yRange)

 

  ;xr和yr 解析:xrange =[0,360],xr是兩個引數,[-0.00000000 ,0.0027777778],透過設定該引數,

  ;那麼轉換後x方向的原資料座標為xr[0]+xr[1]*xrange[0]= -0+0.002777*0 = 0

  ;                          xr[0]+xr[1]*xRange[1]= -0+0.002777*360 =1

  ; 可測試 Norm_Coord([-100,100]) =     [0.500000 , 0.00500000]


  ;歸一化座標顯示

 oImage1->SETPROPERTY, xCoord_conv = xr, $

   yCoord_conv = yr   

  ;獲取當前影像物件的X、Y方向的範圍

 oImage2->GETPROPERTY, xRange = xRange,yRange = yRange

  ;求出歸一化係數

  xr = NORM_COORD(xRange)

  yr = NORM_COORD(yRange)

  ;歸一化座標顯示

 oImage2->SETPROPERTY, xCoord_conv = xr, $

   yCoord_conv = yr   

 oView->SETPROPERTY,viewPlane_Rect  = [0,0,1,1]

 oWindow->SETPROPERTY,title ='歸一化座標顯示'

  ;閃爍顯示

  FOR i=0,6 DO BEGIN

   wait,0.5

   oImage2->SETPROPERTY,hide =(i MOD 2)

   oWindow->DRAW,oView

  ENDFOR 

END

【IDL】同時顯示不同解析度影像的方法

程式碼中知識點歸納:

1、 物件圖形法顯示影像的方式

2、 物件圖形法顯示自帶顏色表的png影像檔案方式(IDLgrPalette物件)

3、 不同座標系統下的影像正確顯示

相關文章