【IDL】同时显示不同分辨率图像的方法
问题:两个图像分辨率不一致的时候,如何正确的同时进行显示呢。
分析:做一个假设,假设两幅图的地理坐标范围一致,图像分辨率不一致,图像的像素尺寸也不一致,那么显示的时候就不能以图像的像素尺寸为准了,需要考虑图像的地理坐标范围。这也是正确的显示多幅带地理坐标的图像所要考虑的内容。
解决:问题归结到显示坐标系上,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、 不同坐标系统下的图像正确显示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界