数字图像处理(一) 插值算法

最邻近内插、双线性内插、双三次内插的MATLAB实现

(1)最邻近内插

最简单的内插方法,把原图像中最邻近的灰度,赋给了每个新位置。但容易产生失真。

im=imread(text.jpg);%读入图片
%采用最近邻插值对图像进行缩放处理
%参数ratio表示缩放倍数
function out_im = myNearest(im, ratio)
    im_size=size(im);%得到原图像的宽高
    im_w=im_size(:,2); %得到原图像的宽
    im_h=im_size(:,1); %得到原图像的高
    nim_w=ceil(im_w*ratio); %得到原图像的宽
    nim_h=ceil(im_h*ratio); %得到新图像的高
    res_im=zeros(nim_h,nim_w);%新的图像矩阵
    for i=1:nim_h
        for j=1:nim_w
            im_x=round(i/ratio);
            im_y=round(j/ratio);%新图像的坐标对应到原图像的位置
            if(im_x<1)
                im_x=1;
            end
            if(im_y<1)
                im_y=1;
            end
            if(im_x>im_h)
                im_x=im_h;
            end
            if(im_y>im_w)
                im_y=im_w;
            end
            %%防止坐标越界
            res_im(i,j)=im(im_x,im_y);
        end
    end
    out_im = uint8(res_im)
end

备注:

ceil() 向上取
round 四舍五入
floor()向下取整
最后要用uint8()对数组重新编码,才能imshow()

(2)双线性内插

双线性内插的本质是利用线性对所求坐标点的近似。
Alt
找到在新图片在原图片中的近似坐标点,并且利用取整,找到最近的四个坐标点。 这里可以知道四个坐标点,横纵坐标相差1,在书中的公式为

V(x,y)=ax + by + cxy + d 

通过周围四个点的值,建立方程,求出 a b c d 的值,这种方法计算量比较大。利用凸组合的概念计算比较简单。
双线性插值中,在图像两个方向上的插值没有先后顺序之分。

%采用最近邻插值对图像进行缩放处理
%双线性内插
function out_im=myBilinear(im, ratio)
    ratio= ratio_2;
    im_size=size(im);%得到原图像的宽高
    im_w=im_size(:,2); %得到原图像的宽
    im_h=im_size(:,1); %得到原图像的高
    nim_w=ceil(im_w*ratio); %得到新图像的宽
    nim_h=ceil(im_h*ratio); %得到新图像的高
    res_im=zeros(nim_h,nim_w);%新的图像矩阵
    for i=1:nim_h
        for j=1:nim_w
            im_x=i/ratio;
            im_y=j/ratio;%新图像的坐标对应到原图像的位置
            im_x2=ceil(im_x);
            im_x1=floor(im_x);
            im_y2=ceil(im_y);
            im_y1=floor(im_y);
            %双线性插值的四个点
            if(im_x1<1)
                im_x1=1;
            end
            if(im_y1<1)            
                im_y1=1;
            end
            if(im_x2>im_h)
                im_x2=im_h;
            end
            if(im_y2>im_w)
                im_y2=im_w;
            end
            %%防止坐标越界
            q1=im(im_x1,im_y1)*(im_x2-im_x)+im(im_x2,im_y1)*(1-im_x2+im_x);
            q2=im(im_x1,im_y2)*(im_x2-im_x)+im(im_x2,im_y2)*(1-im_x2+im_x);%%x方向上的插值
            res_im(i,j)=q1*(im_y2-im_y)+q2*(1-im_y2+im_y);        %y方向上的插值
        end  
    end
    out_im=uint8(res_im);
end

(3)双三次内插

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值