欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图像插值-双线性插值(bilinear)

程序员文章站 2022-05-30 13:22:58
...

双线性插值(bilinear)
本文将未做插值的原始图像称作源图像,源图像插值缩放K倍后的图像称作目标图像。
以下标识符的意义: 图像插值-双线性插值(bilinear)

  1. 算法
    双线性插值的主要思想是目标点归一化后在四周取4个最近邻点,并根据权重对其做线性函数计算,从而得到目标像素点的值。将目标像素点(dstX,dstY)归一化后得(dstX/K,dstY/K),其左上方最近邻源像素点A点坐标为:
srcX=floor(dstX/K);		srcY=floor(dstY/K)
u=dstX/K-srcX; 			 v=dstY/K-srcY

图像插值-双线性插值(bilinear)

根据距离越近,权重越大的原则,A,B,C,D四点的加权系数应为

a=(1-u)*(1-v)     b=u*(1-v)		c=(1-u)*v		d=u*v

四个加权系数之和为1,目标元素点dst(dstX,dstY)值为:

a*src(srcX,srcY)+b*src(srcX+1,srcY)+c*src(srcX,srcY+1)+d*src(srcX+1,srcY+1)
  1. 实现
    本程序是matlab写的一个my_bilinear函数,与matlab自有的imresize函数的bilinear型相对应。可以实现任意倍数的放大。

matlab代码:

function [output]=my_bilinear(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=floor(dstX/K);%最近邻左上方像素点位置
            srcY=floor(dstY/K);
            u=dstX/K-srcX;
            v=dstY/K-srcY;
            a=(1-u)*(1-v);  %最近邻四点的加权系数
            b=u*(1-v);      
            c=(1-u)*v;
            d=u*v;
            srcX(srcX+1>srcN)=srcN-1;   %防止索引源图像界外位置
            srcX(srcX<1)=1;              %这种函数对比if_else耗时较长但简洁
            srcY(srcY+1>srcM)=srcM-1;
            srcY(srcY<1)=1;
                        dst(dstX,dstY,dstC)=a*src(srcX,srcY,dstC)+b*src(srcX+1,srcY,dstC)+c*src(srcX,srcY+1,dstC)+d*src(srcX+1,srcY+1,dstC);
        end
    end
end
output=dst;
end

  1. 评估
    分别使用本文函数my_bilinear函数和matlab的imresize函数中的bilinear型对lena图进行2倍放大,并计时。
    test代码:
close all
figure
A=imread('D:\Files\Downloads\DIP\picture\Lena.jpg');
imshow(A);
figure
tic
imshow(my_bilinear(A,2));
toc
figure
tic
imshow(imresize(A,2,'bilinear'));
toc

结果:
图像插值-双线性插值(bilinear)
细节:
图像插值-双线性插值(bilinear)耗时:图像插值-双线性插值(bilinear)

综上,两者效果无差别,但my_bilinear函数更慢,这是因为matlab自身使用矩阵运算,速度更快。
该算法速度快于双三次慢于最近邻,但效果不如双三次插值好。
附:
最近邻插值
双三次插值