您的位置:首页 > 编程语言 > MATLAB

我写的 matlab 二次差值 图像 旋转

2010-04-24 12:29 253 查看


[x,cmap]=imread('C:/Documents and Settings/Administrator/桌面/matlab/xiaoxiang6.jpg');
% image(x)
[m,n,p]=size(x);
im1=zeros(m,n)
im2=zeros(m,n)
im3=zeros(m,n)
x=double(x)
for i=1:m
for j=1:n
a=x(i,j,1);
im1(i,j)=a;
b=x(i,j,2);
im2(i,j)=b;
c=x(i,j,3);
im3(i,j)=c;
end
end

col=500; %行 屏幕的 大小
row=500; %列
im=zeros(col,row,3);
for i=1:m % 将 原图像在新的画布里移动一小段距离,便于后面的 旋转,以免出现画面不完整的情况
for j=1:n
a=im1(i,j);
im(i +150,j,1)=a;
b=im2(i,j);
im(i+150 ,j,2)=b;
c=im3(i,j);
im(i+150 ,j,3)=c;
end;
end;
newim=zeros(col,row,3);
for ii=1:500
for jj=1:500
i=(sqrt(3)*ii+jj)/2; % 反向用双线性插值法 求出新的坐标在原来坐标系中的位置,正数的话就直接赋值,
j=(6*jj-2*sqrt(3)*ii)/(4*sqrt(3)); %不是的话要进行插值运算求出此点的rgb各个矩阵的元素值然后把此值赋给新的坐标
if i<=150+m && i>=150 && j<=n && j>=0
if i==round(i) && j==round(j)
if i==0 %避免下标出现0的情况
i=1;
end;
if j ==0
j =1;
end;

a=im(i,j,1);
newim(ii,jj,1)=a; % 正数就直接赋值
b=im(i,j,2);
newim(ii,jj,2)=b;
c=im(i,j,3);
newim(ii,jj,3)=c;
else
a=i-round(i-0.5); %不是正数 要进行插值运算。
b=j-round(j-0.5);
c=round(i-0.5); %这里要进行计算与这个不是正数坐标点相邻的点的坐标 还可以吧 哈哈 自己发明的
d=round(j-0.5);
if c==0
c=1
end;
if d==0
d=1;
end; %底下是求新的坐标的rgb各个矩阵的元素值大小 然后反向赋值

a1=round(( im(c+1,d,1)- im(c,d,1))*a+( im(c,d+1)- im(c,d,1))*b+( im(c+1,d+1,1)+ im(c,d,1)- im(c,d+1,1)- im(c+1,d,1))*a*b+ im(c,d,1));
newim(ii,jj,1)=a1;
b1=round(( im(c+1,d,2)- im(c,d,2))*a+( im(c,d+2,2)- im(c,d,2))*b+( im(c+1,d+1,2)+ im(c,d,2)- im(c,d+1,2)- im(c+1,d,2))*a*b+ im(c,d,2));
newim(ii,jj,2)=b1;
c1=round(( im(c+1,d,3)- im(c,d,3))*a+( im(c,d+1,3)- im(c,d,3))*b+( im(c+1,d+1,3)+ im(c,d,3)- im(c,d+1,3)- im(c+1,d,3))*a*b+ im(c,d,3));
newim(ii,jj,3)=c1;
end;
end;

end;
end;

newim=uint8(newim);
im=uint8(im)
newim % 一定要强制转化为 uint8类型 ,才能 用image() 函数
image(newim);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: