IDL图像旋转间接法双线性内插法

 

 

pro test

  ;***1. 输入旋转文件,可以修改
  file = 'C:\Users\ASUS\Desktop\作业\遥感程序设计\ch06-2作业图像旋转idl程序\jz512-rgb.tif'
  ;***1. 输入旋转角度,可以修改 
  angle = 20   

  ;***2. 读取 tiff 格式图像
  tm_data = READ_TIFF(file)     
  dims = size(tm_data, /DIMENSIONS)     ;图像数据大小,行,列 
  print,dims
  ;***3. 显示图像 
  ;定义显示窗口,和数据同样大的窗口
  window, 0, xsize = dims[1], ysize = dims[2], $  
  TITLE = 'Landsat TM data of Jiaozuo' 
  ;显示图像,注意加入order关键字 ,图像变正
  TV, tm_data,TRUE=1,/order 

  pi=3.14159265

  ;***4. 定义旋转矩阵,
  ;还记得旋转矩阵的使用吗??? 
  ;[x',y']=|cosA, sinA| * [x,y] 
  ;        |-sinA,cosA|

  Rot=[[cos(angle*pi/180),sin(angle*pi/180)],   $
       [-1*sin(angle*pi/180),cos(angle*pi/180)]]  
  
  ;***5. 定义四个角点坐标,[0,0]为原点 
  BT1=[0,0]             ;左上角点坐标
  BT2=[0,dims[1]-1]     ;右上角点坐标
  BT3=[dims[2]-1,0]     ;左下角点坐标
  BT4=[dims[2]-1,dims[1]-1] ;右下角点坐标
  
  BT1_rot=Rot           ;旋转左上角点坐标
  BT2_rot=Rot#BT2       ;旋转右上角点坐标
  BT3_rot=Rot#BT3       ;旋转左下角点坐标
  BT4_rot=Rot#BT4       ;旋转右下角点坐标
  
  x_min=min([BT1_rot[0],BT2_rot[0],BT3_rot[0],BT4_rot[0]])  ;旋转后图像最小x值
  y_min=min([BT1_rot[1],BT2_rot[1],BT3_rot[1],BT4_rot[1]])  ;旋转后图像最小y值
  x_max=max([BT1_rot[0],BT2_rot[0],BT3_rot[0],BT4_rot[0]])  ;旋转后图像最大x值
  y_max=max([BT1_rot[1],BT2_rot[1],BT3_rot[1],BT4_rot[1]])  ;旋转后图像最大y值
  
  width=x_max-x_min+1   ;旋转后图像宽度
  height=y_max-y_min+1  ;旋转后图像高度
  
  ;***6. 新建MxNx3的空矩阵,用于存储旋转后彩色图像
  img_rot=intarr(3,height,width)   
  
  ;***7. *********采用双线性内插法旋转图像********
  for i = 0, width-1 do begin
      for j = 0, height-1 do begin
      
          x_rot=i+x_min
          y_rot=j+y_min
          
          ; 坐标变换
          x = (x_rot*cos(angle*pi/180))+(y_rot*sin(angle*pi/180))
          y = (y_rot*cos(angle*pi/180)) - (x_rot*sin(angle*pi/180))
          
          ; 确定四个领域像素的坐标和权重
          x1=floor(x)
          x2=x1+1
          y1=floor(y)
          y2=y1+1
          
          wx2=x-x1
          wy2=y-y1
          wx1=1-wx2
          wy1=1-wy2
          
          ; 边界情况的处理
       if x1 gt 0 and x2 le dims[1]-1 and y1 gt 0 and y2 le dims[2]-1 then begin
      
          ; 四个领域像素取值
          p11=tm_data[*,x1,y1]
          p12=tm_data[*,x1,y2]
          p21=tm_data[*,x2,y1]
          p22=tm_data[*,x2,y2]
          
          ; 双线性内插计算 
          for k=0,2 do begin
              img_rot[k,j,i]=wx1*wy1*p11[k]+wx1*wy2*p12[k]+wx2*wy1*p21[k]+wx2*wy2*p22[k]
          endfor
       endif
     endfor
 endfor
  
  ;***8. 显示旋转后图像
  dimsrot= size(img_rot, /DIMENSIONS)
  window, 1, xsize = dimsrot[1], ysize = dimsrot[2], $ 
  TITLE = 'Rotation of Landsat TM data Jiaozuo'   
  TV, img_rot, TRUE=1   
        
  ;***9.保存旋转图像为tiff格式
  tif_rot_file = 'C:\Users\ASUS\Desktop\作业\遥感程序设计\ch06-2作业图像旋转idl程序\jz512-rgb-rotation-bilinear.tif'
  WRITE_TIFF, tif_rot_file, img_rot
  
  print,'end pro'
End

  ;***8. 显示旋转后图像
  dimsrot= size(img_rot, /DIMENSIONS)
  window, 1, xsize = dimsrot[1], ysize = dimsrot[2], $ 
  TITLE = 'Rotation of Landsat TM data Jiaozuo'   
  TV, img_rot, TRUE=1   
        
  ;***9.保存旋转图像为tiff格式
  tif_rot_file = 'C:\Users\ASUS\Desktop\ch06-2作业图像旋转idl程序\jz512-rgb-rotation-bilinear.tif'
  WRITE_TIFF, tif_rot_file, img_rot
  
  print,'end pro'
End

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
IDL中的间接图像旋转可以通过以下步骤实现: 1. 读取原始图像数据并创建一个新的输出图像数组,用于存储旋转后的图像数据。 2. 计算旋转后的图像的大小和中心点坐标。可以使用IDL的IMAGETRANSFORM函数来计算。 3. 循环遍历旋转后的图像像素,并计算出它们在原始图像中对应的像素坐标。 4. 对于每个旋转后的像素,通过双线性插值或三次样条插值等方计算其在原始图像中的像素值。 5. 将计算出的像素值赋给输出图像数组中对应的像素位置。 下面是一个示例代码: ``` ; 读取原始图像数据 img = READ_IMAGE('input_image.png') ; 计算旋转角度和旋转后的图像大小 angle = 45.0 rotated_img_size = [ROUND(SIZE(img, 0)*SQRT(2)), ROUND(SIZE(img, 1)*SQRT(2))] rotated_img_center = [rotated_img_size[0]/2.0, rotated_img_size[1]/2.0] ; 创建输出图像数组 rotated_img = FLTARR(rotated_img_size[0], rotated_img_size[1]) ; 循环遍历旋转后的像素,并计算它们在原始图像中的像素值 FOR i=0, rotated_img_size[0]-1 DO BEGIN FOR j=0, rotated_img_size[1]-1 DO BEGIN ; 计算旋转后的像素坐标在原始图像中对应的像素坐标 rotated_pixel_coord = [i, j] - rotated_img_center original_pixel_coord = [rotated_pixel_coord[0]*COS(-angle)+rotated_pixel_coord[1]*SIN(-angle), -rotated_pixel_coord[0]*SIN(-angle)+rotated_pixel_coord[1]*COS(-angle)] + [SIZE(img, 0)/2.0, SIZE(img, 1)/2.0] ; 双线性插值计算像素值 rotated_img[i, j] = BILINEAR(original_pixel_coord[0], original_pixel_coord[1], img) ENDFOR ENDFOR ; 保存旋转后的图像 WRITE_PNG, 'rotated_image.png', rotated_img ``` 这个代码将原始图像逆时针旋转45度,并使用双线性插值方计算旋转后的像素值。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值