阅读:2278回复:0
[原创]图像旋转重采样(IDL)
<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> |
|