加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

用MATLAB掌握图像平移、图像旋转和图像缩放的基本原理与实现方法

(2011-01-31 13:24:34)
标签:

杂谈

分类: Matlab
%图像平移(1)
F=imread('p2.bmp'); 
se = translate(strel(1), [0 20]); 
%参数[0 20]可以修改,修改后平移距离对应改变 
J = imdilate(F,se); 
figure; 
imshow(J,[]);title('右移后图形'); 

%图像平移(2)
function outImage=immove(inImage,Tx,Ty)
[m, n] = size(inImage);
Tx=fix(Tx);
Ty=fix(Ty);

%move x
if (Tx<0)
inImage=imcrop(inImage,[abs(Tx),1,m-abs(Tx),n]);
[m, n] = size(inImage);
Tx=0; 
end

%move y
if (Ty<0)
inImage=imcrop(inImage,[1,abs(Ty),m,n-abs(Ty)]);
[m, n] = size(inImage);
Ty=0; 
end

outImage = zeros(m+Ty, n+Tx);
outImage(1+Ty:m+Ty,1+Tx:n+Tx) = inImage;

%图像旋转 
%X,Y为其行列数 
Image=imread('02.jpg'); 
Image=rgb2gray(Image); 
angle=30; 
%角度任意的一个数 表示30度 
pai=3.14; 
Angle=pai*angle/180; 
%转换一下角度的表示方法。 
[X,Y]=size(Image); 

%原图显示 
subplot(2,1,1); 
imshow(Image); 
title('原图像'); 

%计算四个角点的新坐标,确定旋转后的显示区域 
LeftTop(1,1)=-(Y-1)*sin(Angle); 
LeftTop(1,2)=(Y-1)*cos(Angle); 

LeftBottom(1,1)=0; 
LeftBottom(1,2)=0; 

RightTop(1,1)=(X-1)*cos(Angle)-(Y-1)*sin(Angle); 
RightTop(1,2)=(X-1)*sin(Angle)+(Y-1)*cos(Angle); 

RightBottom(1,1)=(X-1)*cos(Angle); 
RightBottom(1,2)=(X-1)*sin(Angle); 

%计算显示区域的行列数 
Xnew=max([LeftTop(1,1),LeftBottom(1,1),RightTop(1,1),RightBottom(1,1)])-min([LeftTop(1,1),LeftBottom(1,1),RightTop(1,1),RightBottom(1,1)]); 
Ynew=max([LeftTop(1,2),LeftBottom(1,2),RightTop(1,2),RightBottom(1,2)])-min([LeftTop(1,2),LeftBottom(1,2),RightTop(1,2),RightBottom(1,2)]); 

% 分配新显示区域矩阵 
ImageNew=zeros(round(Xnew),round(Ynew))+255; 

%计算原图像各像素的新坐标 
for indexX=0:(X-1) 
for indexY=0:(Y-1) 
ImageNew(round(indexX*cos(Angle)-indexY*sin(Angle))+round(abs(min([LeftTop(1,1),LeftBottom(1,1),RightTop(1,1),RightBottom(1,1)])))+1,1+round(indexX*sin(Angle)+indexY*cos(Angle))+round(abs(min([LeftTop(1,2),LeftBottom(1,2),RightTop(1,2),RightBottom(1,2)]))))=Image(indexX+1,indexY+1); 
end 
end 

%显示 
subplot(2,1,2); 
imshow((ImageNew)/255) 
promp=['旋转角度为:' int2str(angle) '的图像'] 
title(promp); 

%图像缩放 
function y=resize(a,mul,type) 
%**************************************************** 
%a:输入图像灰度值 
%mul:缩放倍数 
%type:1表示最邻近法,2表示双极性插值法 
%画出缩放后图像并返回其灰度值 
%**************************************************** 
[m,n]=size(a); 
m1=m*mul;n1=n*mul; 
%**************************************************** 
if type==1 
for i=1:m1 
for j=1:n1; 
b(i,j)=a(round(i/mul),round(j/mul)); 
end 
end 
elseif type==2 
for i=1:m1-1 
for j=1:n1-1; 
u0=i/mul;v0=j/mul; 
u=round(u0);v=round(v0); 
s=u0-u;t=v0-v; 
b(i,j)=(a(u+1,v)-a(u,v))*s+(a(u,v+1)-a(u,v))*t+(a(u+1,v+1)+a(u,v)-a(u,v+1)-a(u+1,v))*s*t+a(u,v); 
end 
end 
end 
%***************************************************** 
b=uint8(b); 
imshow(b); 
title('处理后图像'); 
y=b;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有