图像插值-最近邻插值(nearest)

最近邻插值(nearest)
本文将未做插值的原始图像称作源图像,源图像插值缩放K倍后的图像称作目标图像。
以下标识符的意义:
在这里插入图片描述

  1. 算法
    该算法不凭空设定元素点的值,而是选择源图像中最近邻像素点来填充目标图像。
    那么,目标元素点所选择的源图像元素点位置应为:
    srcX=round(dstX/K)
    srcY=round(dstY/K)
    其中,round表示将值四舍五入为整数
  2. 实现
    本程序是matlab写的一个my_nearest函数,与matlab自有的imresize的nearest型函数相对应。可以实现任意倍数的放大(其中涉及边界索引的问题需要注意,这在双线性和双三次插值中也会遇到)。

matlab代码:

function [dst]=my_nearest(src,K)
%最近邻法插值
%输入:源图像src,放大倍数K
%输出:目标图像矩阵dst

[srcM,srcN,srcC]=size(src);%读取源图像元素点的行列数及色板数
dstM=round(K*srcM);%该处仍要确保当放大倍数K非整数时目标图像大小为整数
dstN=round(K*srcN);
 
%使用class将数据类型统一,目标图像初始化
dst=ones(dstM,dstN,srcC,class(src));
 
%逐像素点赋值
for dstX=1:dstM
    for dstY=1:dstN
        for dstC=1:srcC
            srcX=round(dstX/K);
            srcY=round(dstY/K);
            srcX(srcX>srcN)=srcN; %防止索引源图像界外位置,该函数很耗时但简洁
            srcX(srcX<1)=1;
            srcY(srcY>srcM)=srcM ;
            srcY(srcY<1)=1;
            dst(dstX,dstY,dstC)=src(srcX,srcY,dstC);
        end
    end
end
end

  1. 评估
    分别使用本文函数my_nearest函数和matlab的imresize函数中的neaerest型对lena图进行2倍放大,并计时。

    test代码:

close all
figure
A=imread('D:\Files\Downloads\DIP\picture\Lena.jpg');
imshow(A);
figure
tic
imshow(my_nearest(A,2));
toc
figure
tic
imshow(imresize(A,2,'nearest'));
toc

结果:
在这里插入图片描述

细节:
在这里插入图片描述
耗时对比:在这里插入图片描述
综上,两者效果无差别,但my_nearest函数更慢,这是因为matlab自身使用矩阵运算,速度更快。
该算法速度快,但效果不如双线性插值和双三次插值好。
附:
双线性插值
双三次插值

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值