关于双线性插值

方法一:Opencv自带的用插值办法做的图像缩放
     dst_cvsize.width=(int)(scr->width*scale);

        dst_cvsize.height=(int)(scr->height*scale);

        dst=cvCreateImage(dst_cvsize,scr->depth,scr->nChannels);



        cvResize(scr,dst,CV_INTER_LINEAR);//

//             CV_INTER_NN - 最近邻插值,

//             CV_INTER_LINEAR - 双线性插值 (缺省使用)

//             CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。

         /*当图像放大时,类似于 CV_INTER_NN 方法..*/

//             CV_INTER_CUBIC - 立方插值.



    
方法二:matlab实现(灰度图)
close all;

clear all;

clc;



m=1.8;              %放大或缩小的高度

n=2.3;              %放大或缩小的宽度

img=imread('lena.jpg');

imshow(img);

[h w]=size(img);

imgn=zeros(h*m,w*n);

rot=[m 0 0;0 n 0;0 0 1];                                   %变换矩阵



for i=1:h*m

    for j=1:w*n

        pix=[i j 1]/rot;   

        

        float_Y=pix(1)-floor(pix(1)); 

        float_X=pix(2)-floor(pix(2));

       

        if pix(1) < 1        %边界处理

            pix(1) = 1;

        end

        

        if pix(1) > h

            pix(1) = h;

        end

        

        if pix(2) < 1

            pix(2) =1;

        end

        

        if pix(2) > w

            pix(2) =w;

        end

        

        pix_up_left=[floor(pix(1)) floor(pix(2))];    %四个相邻的点

        pix_up_right=[floor(pix(1)) ceil(pix(2))];

        pix_down_left=[ceil(pix(1)) floor(pix(2))];

        pix_down_right=[ceil(pix(1)) ceil(pix(2))];     

    

        value_up_left=(1-float_X)*(1-float_Y);      %计算临近四个点的权重

        value_up_right=float_X*(1-float_Y);

        value_down_left=(1-float_X)*float_Y;

        value_down_right=float_X*float_Y;

                                    %按权重进行双线性插值

        imgn(i,j)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...

                  value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...

                  value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...

                  value_down_right*img(pix_down_right(1),pix_down_right(2));        

    end

end



figure,imshow(uint8(imgn))

你可能感兴趣的:(值)