[图像]图像缩放算法-双线性内插法

来源:互联网 发布:mac 最高权限 编辑:程序博客网 时间:2024/05/02 18:50

原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:http://blog.csdn.net/humanking7/article/details/45014879


简介:
图像缩放算法–双线性内插法,以及详解Matlab二维插值算法的 interp2()

1.原理介绍

双线性内插法是利用待求象素四个邻象素的灰度 (RGB可以分别进行插值) 在两个方向上作线性内插,公式推导如下 (原谅我没用visio和MathType,还是用手简单粗暴)

这里写图片描述

2.代码实现

原来做这个只是为了验证一下 Matlabinterp2() 函数,但是发现了一些问题,原来以为是 Matlab 错了,最后发现是我太年轻了,不过也怪文档不清晰 (感觉吐槽好无力啊)

众所周知,Matlab的取值是先行后列,但这个函数的用的坐标系是图像坐标系,如上图所示,所以函数 interp2(src, x, y) 中的 xy 不是 矩阵src 的行和列,而且 x和y 既可以单一的 位置值,也可以是 位置值的矩阵,其实很简单的映射关系,但是就是特别绕 (我承认我智商有点着急) 。代码附上 (Matlab实现)

2.1.插值函数代码:

    function zi = qfxInterp2(src, x, y)    % if src is a matrices , number x expresses the position in the column direction and the number y expresses the position in the row direction.    % O ---------------------> x(u,i)    % |    % |    % |  点src(x, y) 在Matlab里面表示为 src(y, x)    % |    % |    % |    % y(v,j)    % x与y应该有着相同的大小。最终形成的zi也是和x, y的size相同。    % 如果用这个函数进行图像的变换, 则src是图像, x和y还有zi应该和src的size一样大, 关系为:    % 点zi(u, v)是原图像中的点src( x(u, v), y(u, v) ), 但实际上这个点是通过插值得到的。x, y, src, zi都是u*v大小的矩阵, 只是src和zi存的是像素值, x和y存的是zi对应像素的插值坐标。    % src(i, j)=a ----------------src(i+1, j)=b    % |                      |    % |                      dv    % |                      |    % |                    src(i+du,j+dv)    % |<--------- du --------->    % src(i, j+1)=c---------------src(i+1, j+1)=d    %Matlab的取值顺序和上述的坐标系不同, 注意切记    [row,col] = size(x);    [imax,jmax] = size(src);%不能超过插值表的界限    for v = 1:row        for u = 1:col            i = floor(x(v,u));            j = floor(y(v,u));            du = x(v,u) - i;            dv = y(v,u) - j;            a = getValue(src, j, i, jmax, imax);            b = getValue(src, j, i+1, jmax, imax);            c = getValue(src, j+1,i, jmax, imax);            d = getValue(src, j+1,i+1, jmax, imax);            zi(v,u) = (1-du)*(1-dv)*a + (1-dv)*du*b + (1-du)*dv*c + du*dv*d;        end    end    end    function value = getValue(mat,r,c,rMax,cMax)        if((r>rMax)||(r<=0)||(c>cMax)||(c<=0))            value = 0;        else            value = mat(r,c);        end    end

2.2.结果对比:

调用函数以及与 Matlabinterp2() 对比:

    clear    clc    source = [ 1, 2;               3, 4];    %想要插值的目标位置    xLocal = [1.2,1.2 ;              1.8,1.7];    yLocal = [1.2,1.8;              1.2,1.8];    I = interp2(source, xLocal, yLocal )    I2 = qfxInterp2(source,xLocal,yLocal)

Matlab输出效果:

I =    1.6000    2.8000    2.2000    3.3000I2 =    1.6000    2.8000    2.2000    3.3000
3 0
原创粉丝点击