MATLAB 最邻近插值、双线性插值以及三次卷积插值的实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


提示:以下是本篇文章正文内容,下面案例可供参考

​​​​​​

理论知识网上都有,这边直接展示代码和运行结果。

1、最邻近插值

%R 放大倍数
function M=closet(filename,R)
F=imread(filename);
[row,col,color]=size(F);
row=row*R;
col=col*R;
M=zeros(row,col,color,class(F));
for i=1:row
    for j=1:col
       for n=1:color
            x = floor(i/R+0.5);
            y = floor(j/R+0.5);
            %为了避免出现‘位置 1 处的索引无效。数组索引必须为正整数或逻辑值’的问题。
            %Matlab中的数组或矩阵的下标最小为1
             if x==0
                x=x+1
             end
             if y==0
                y=y+1
             end
             M(i,j,n) = F(x,y,n);
        end
   end
end
    figure(1);
    imshow(F);
    figure(2);
    imshow(M)
end

 注:这里我把代码写成了函数,使用时调用函数即可(文件名称根据自己的来)。

调用代码:

M=closet('写轮眼.jpg',3);

 运行结果:

 

2、双线性插值

function A=bilinear(filename,C)
F=imread(filename);
[row,col,color]=size(F);
row=row*C;
col=col*C;
[d,e,f]=size(F);
A=zeros(row,col,color,class(F));
for i = 1:row
    for j = 1:col
        for n = 1:color
            x = floor(i/C);
            y = floor(j/C);
            if x == 0
                x = x+1;
            end
            if y ==0
                y = y+1;
            end
            u = i/C-floor(i/C); 
            v = j/C-floor(j/C); %求出dx和dy
                 if x==d
                     x=x-1;
                 end
                 if y==e
                     y=y-1;
                 end
                    A(i,j,n) =(1-u)*(1-v)*F(x,y,n)+(1-u)*v*F(x+1,y,n)+u*(1-v)*F(x,y+1,n)+u*v*F(x+1,y+1,n);
        end
    end
end
figure(3);
imshow(F);
figure(4);
imshow(A)
end

 

运行结果:

 

结果分析:因为前两种插值都是彩色图像作为原图像,容易对比。两种插值方法的结果都是把原图像的一个像素分为9个小像素(放大可见,双线性较为明显);双线性插值的结果中9个小像素的颜色各不相同,出现了明显的颜色变化,这说明 该算法的功能性很好。

3、三次卷积插值

function g=SSJJ(filename,k)
F=imread(filename);                               
[m,n,color]=size(F);  
f=rgb2gray(F);
a=f(1,:);
c=f(m,:) ;        %将图像扩展四行四列
b=[f(1,1),f(1,1),f(:,1)',f(m,1),f(m,1)];
d=[f(1,n),f(1,n),f(:,n)',f(m,n),f(m,n)];
a1=[a;a;f;c;c];
b1=[b;b;a1';d;d];
f=b1';
f1=double(f);
for i=1:m*k
    dx=i/k-floor(i/k);           
     x=floor(i/k)+2;   
     A=[sw(1+dx) sw(dx) sw(1-dx) sw(2-dx)];   %四个横坐标的权重W(i)
  for j=1:n*k
    dy=rem(j,k)/k;
     y=floor(j/k)+2;   
    C=[sw(1+dy);sw(dy);sw(1-dy);sw(2-dy)]; 
    B=[f1(x-1,y-1),f1(x-1,y) ,f1(x-1,y+1), f1(x-1,y+2)    
         f1(x ,y-1),f1(x,   y),f1(x,  y+1),f1(x,   y+2)
         f1(x+1,y-1),f1(x+1,y),f1(x+1,y+1),f1(x+1,y+2)
         f1(x+2,y-1),f1(x+2,y),f1(x+2,y+1),f1(x+2,y+2)];
    g1(i,j)=(A*B*C);
  end
end
g=uint8(g1); %将矩阵转换成整数类型
imshow(g);
end

 代码中用到的sw函数代码如下:

function A=sw(w1)
w=abs(w1);
a=-0.5;
if w<1&&w>=0
  A=1-(a+3)*w^2+(a+2)*w^3;
else if w>=1&&w<2
  A=a*w^3-5*a*w^2+(8*a)*w-4*a;
else
  A=0;
    end
end
end

 运行结果:

 总结:对比前两种插值方法很明显可以发现双线性插值的效果好于最邻近插值;理论上说三次卷积插值效果要好于前两种,这里不好做比较,就不再谈了。

 

 

 

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

  • 5
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值