栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 的一种工具,该工具是为了解决数据分析任务而创建的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/304338.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号