双线性插值法(Bilinear interpolation)

双线性插值法(Bilinear interpolation)是利用待求象素反变换到原图像对应的浮点坐标,邻近的四个象素在两个方向上作线性内插。四邻近像素值的加权平均即为待测点像素值,计算权重反比于浮点在双线性方向上的映射距离。
双线性插值是利用了需要处理的原始图像浮点坐标周围的四个像素点的相关性,通过双线性算法计算。同上A中所设,目的坐标M(x,y)和浮点坐标m(i+u,j+v),则:

f(M)=(1-u)(1-v)*f(i,j)+(1-u)v*f(i,j+1)+ u(1-v)*f(i+1,j) +uv*f(i+1,j+1)

function re_im = dlinear(im, p, q)
%双线性插值法实现图像缩放,输入目标图像和行缩放、纵缩放倍数
%ziheng 2016.3.29
%imshow(im);
[m,n] = size(im);
im_R = im(:,:,1);
im_G = im(:,:,2);
im_B = im(:,:,3);
l = round(m*p);
h = round(n*q)/3;
re_R = uint8(zeros(l,h));
re_G = uint8(zeros(l,h));
re_B = uint8(zeros(l,h));
for dstx = 1:l
    for dsty = 1:h
        x = floor(dstx/p); u = dstx/p - x;
        y = floor(dsty/q); v = dsty/q - y;
        xx = max(1,x); xa = min(m,x+1);
        yy = max(1,y); ya = min(n/3,y+1);
        re_R(dstx,dsty) = (1-u)*(1-v)*im_R(xx,yy) + u*(1-v)*im_R(xa,yy)+(1-u)*v*im_R(xx,ya) + u*v*im_R(xa,ya);
        re_G(dstx,dsty) = (1-u)*(1-v)*im_G(xx,yy) + u*(1-v)*im_G(xa,yy)+(1-u)*v*im_G(xx,ya) + u*v*im_G(xa,ya);
        re_B(dstx,dsty) = (1-u)*(1-v)*im_B(xx,yy) + u*(1-v)*im_B(xa,yy)+(1-u)*v*im_B(xx,ya) + u*v*im_B(xa,ya);
    end
end
re_im = cat(3,re_R,re_G,re_B);
figure,imshow(re_im);

你可能感兴趣的:(学习笔记)