yzhacm
路人甲
路人甲
  • 注册日期2005-03-02
  • 发帖数20
  • QQ
  • 铜币247枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2143回复:0

[原创]图像旋转重采样(IDL)

楼主#
更多 发布于:2008-03-09 17:09
<P>;-----------------------<BR>;图像旋转<BR>;-----------------------<BR>;此程序适用于单波段的灰度图,为了可读性未加优化<BR>;对于多波段或RGB图,稍加修改即可</P>
<P>;Origimg原始参考影像<BR>;angle为旋转的角度(单位:度)<BR>;centerPoint为子图中心点坐标<BR>;subRadius子图半径<BR>;interploatestyle内插方式</P>
<P>function ImageRotate,origimg,angle,centerpoint,subRadius,interpolatestyle<BR><BR>IF N_Elements(interpolateStyle) eq 0 THEN   interpolateStyle=1<BR>IF N_Elements(angle) eq 0 THEN   angle=10<BR>IF N_Elements(centerpoint) eq 0 THEN   centerpoint=1<BR>IF N_Elements(subRadius) eq 0 THEN   subRadius=50 <BR><BR>subImg=bytarr(subRadius*2+1,subRadius*2+1) ;结果子图<BR>imageSize = Size(Origimg, /Dimensions)<BR><BR>angle=angle*!dpi/180.0 ;角度转化为弧度<BR>  <BR>;旋转变换矩阵<BR>rmatrix=[[cos(angle),-sin(angle),0],[sin(angle),cos(angle),0],[0,0,1]]</P>
<P>for i=-subRadius,subRadius do begin<BR>   for j=-subRadius,subRadius do begin<BR>    origCoord=[i,j,0]<BR>    distortCoord=rmatrix##origCoord<BR>    distortCoord=transpose(distortCoord)</P>
<P>    ;最邻近点内插法<BR>    if interpolateStyle eq 1 then begin<BR>     distortX=round(distortCoord[0]+centerPoint[0])<BR>     distortY=round(distortCoord[1]+centerPoint[1])<BR>     ;确定重采样点在原图范围内<BR>     if (distortX ge 0) and (distortX lt imageSize[0]-1) and (distortY ge 0) and (distortY lt imageSize[1]-1) then begin<BR>      subImg[i+subRadius,j+subRadius]=Origimg[distortX,distortY]<BR>     endif else begin<BR>      subImg[i+subRadius,j+subRadius]=0<BR>     endelse<BR>    endif</P>
<P>    ;双线性内插法<BR>    if interpolateStyle eq 2 then begin<BR>     distortX=floor(distortCoord[0]+centerPoint[0])<BR>     distortY=floor(distortCoord[1]+centerPoint[1])<BR>     if (distortX ge 0) and (distortX lt imageSize[0]-1) and (distortY ge 0) and (distortY lt imageSize[1]-1) then begin<BR>      temp=Origimg[distortX:distortX+1,distortY:distortY+1]<BR>      IX=distortCoord[0]-floor(distortCoord[0])<BR>      IY=distortCoord[1]-floor(distortCoord[1])<BR>      subImg[i+subRadius,j+subRadius]= BILINEAR(temp, IX, IY)<BR>     endif else begin<BR>      subImg[i+subRadius,j+subRadius]=0<BR>     endelse<BR>    endif</P>
<P><BR>   endfor<BR>endfor</P>
<P>return,subImg</P>
<P>end</P>
<P>;------------------<BR>pro ImageRotate_test<BR>; 获取本程序所在文件路径<BR>RootDir = Sourceroot()<BR>file=RootDir+'\8bit_campus.bmp'<BR>DEVICE, DECOMPOSED=1<BR><BR>radius=100<BR>centerp=[400,400]<BR>angle=20<BR><BR>image=READ_IMAGE(file)<BR>imageSize = Size(image, /Dimensions)<BR>WINDOW,/free, XSIZE = imageSize[0], YSIZE =imageSize[1]<BR>TV, image<BR>PLOTS,[centerp[0]-radius,centerp[0]+radius],[centerp[1]-radius,centerp[1]-radius],/DEVICE,color='0000ff'xl<BR>PLOTS,[centerp[0]-radius,centerp[0]+radius],[centerp[1]+radius,centerp[1]+radius],/DEVICE,color='0000ff'xl<BR>PLOTS,[centerp[0]-radius,centerp[0]-radius],[centerp[1]-radius,centerp[1]+radius],/DEVICE,color='0000ff'xl<BR>PLOTS,[centerp[0]+radius,centerp[0]+radius],[centerp[1]-radius,centerp[1]+radius],/DEVICE,color='0000ff'xl<BR>  <BR>rotimage=ImageRotate(image,angle,centerp,radius,1)<BR>imageSize = Size(rotimage, /Dimensions)<BR><BR>WINDOW,/free, XSIZE =imageSize[0], YSIZE =imageSize[1]<BR>TV, rotimage</P>
<P>end</P>
<P>;更多内容请访问我的个人博客 hi.baidu.com/yzhglory</P>
<P>;********************************************************************</P>
喜欢0 评分0
游客

返回顶部