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

本文介绍了一种使用MATLAB实现图像旋转的方法,并详细解释了如何通过双线性插值来保持图像质量。该过程包括读取图像、分离颜色通道、创建新图像以及进行坐标转换等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[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);
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值