双线性插值及Matlab实现一、简单实例

opencv 双线性插值python 双线性插值matlab代码_双线性插值大小的灰度图opencv 双线性插值python 双线性插值matlab代码_计算机视觉_02,如下所示:

opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_03目标图像opencv 双线性插值python 双线性插值matlab代码_图像处理_04期望大小为opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_05,则若要构建原始图像与目标图像之间的对应关系,根据之前的论述(最近邻插值及Matlab实现,后续有关扩展原始图像的内容也参看此篇),其映射公式为:

opencv 双线性插值python 双线性插值matlab代码_图像处理_06其中opencv 双线性插值python 双线性插值matlab代码_计算机视觉_07opencv 双线性插值python 双线性插值matlab代码_计算机视觉_08分别为目标图像opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_09opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_10处所对应的原图像坐标,那么,假设现需要求解目标图像的第一个像素,则有:

opencv 双线性插值python 双线性插值matlab代码_图像处理_11双线性插值所使用的像素信息为所计算的对应原始图像位置处周围的四个像素点,由于此时计算所得的坐标为opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_12,因此如下对原始图像进行对称扩展,如下图所示:

opencv 双线性插值python 双线性插值matlab代码_图像处理_13

红色点处即为所求点,根据对称扩展,此时决定所求点数值的四个像素分别为1、2、4、5,对应数值见上述矩阵,双线性插值便是在opencv 双线性插值python 双线性插值matlab代码_图像处理_14opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_15方向分别进行加权运算,此时待求点为opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_12,则opencv 双线性插值python 双线性插值matlab代码_图像处理_14方向上加权求得结果为:

opencv 双线性插值python 双线性插值matlab代码_双线性插值_18

以底边灰点为例,其距离像素点0.2较远,则其权重较低;距离像素点0.1较近,则其权重较高。同理,在计算完毕opencv 双线性插值python 双线性插值matlab代码_图像处理_14方向后,进行opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_15方向的计算为:opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_21,则目标图像的第一个像素点为0.26。这一过程经过计算后并不复杂,此处只做简单示例与Matlab实现,故不对其进行推导。全部求解完毕得到目标图像如下:

opencv 双线性插值python 双线性插值matlab代码_matlab_22  通过上述简单例子可以看出,双线性插值对于目标图像的每一个像素点的估计采用了其对应的四个像素点的加权组合,产生了新的像素信息,故结果较之最近邻插值较好,并且也不会过于像素化,但也不可避免的出现模糊,如下图所示为利用双线性插值实现图像放大三倍的结果以及比较。

opencv 双线性插值python 双线性插值matlab代码_双线性插值_23

opencv 双线性插值python 双线性插值matlab代码_opencv 双线性插值python_24

二、Matlab实现

Matlab实现如下:

function R = bilinear(src, scale)
%% 双线性插值
src = double(src) / 255;
% 判断是灰度图还是RGB图像
if ismatrix(src)
    R = zeros(floor(size(src) * scale));
else
    R = zeros([floor(size(src, 1, 2) * scale), 3]);
end
% 扩展原始图像
misrc = zeros([size(src, 1, 2) + 2 * floor(scale), size(R, 3)]);
for i = 1 : size(R, 3)
    tmp = padarray(src(:, :, i), [floor(scale), floor(scale)], 'symmetric');
    misrc(:, :, i) = tmp;
end

for i = 1 : size(R, 1)
    for j = 1 : size(R, 2)
        srcX = floor((i + 0.5) / scale - 0.5);
        srcY = floor((j + 0.5) / scale - 0.5);
        u = ((i + 0.5) / scale - 0.5) - srcX;
        v = ((j + 0.5) / scale - 0.5) - srcY;
        tmp = (1 - u) * (1 - v) * misrc(round(srcX + scale), round(srcY + scale), :) ...
            + (1 - u) * v * misrc(round(srcX + scale), round(srcY + scale) + 1, :) ...
            + u * (1 - v) * misrc(round(srcX + scale) + 1, round(srcY + scale), :) ...
            + u * v * misrc(round(srcX + scale) + 1, round(srcY + scale) + 1, :);
        R(i, j, :) = tmp(:);
    end
end
end