問題:兩個影像解析度不一致的時候,如何正確的同時進行顯示呢。
分析:做一個假設,假設兩幅圖的地理座標範圍一致,影像解析度不一致,影像的畫素尺寸也不一致,那麼顯示的時候就不能以影像的畫素尺寸為準了,需要考慮影像的地理座標範圍。這也是正確的顯示多幅帶地理座標的影像所要考慮的內容。
解決:問題歸結到顯示座標系上,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
程式碼中知識點歸納:
1、 物件圖形法顯示影像的方式
2、 物件圖形法顯示自帶顏色表的png影像檔案方式(IDLgrPalette物件)
3、 不同座標系統下的影像正確顯示