您的位置:首页 > 编程语言

双线性插值2-代码

2016-05-08 18:40 337 查看
双线性插值较为常用,原理参考http://www.cnblogs.com/linkr/p/3630902.html

下面给出代码:

[cpp] view
plain copy

void ImgResize_BiLinear()  

{  

    cv::Mat imgSrc, imgDst1, imgDst2;    

  

    imgSrc = cv::imread("test.jpg");    

    imgDst1 = cv::Mat(cv::Size(imgSrc.cols*2, imgSrc.rows*2), imgSrc.type(), cv::Scalar::all(0));    

    imgDst2 = cv::Mat(imgDst1.size(), imgSrc.type(), cv::Scalar::all(0));    

  

    double scale_x = (double)imgSrc.cols / imgDst1.cols;    

    double scale_y = (double)imgSrc.rows / imgDst1.rows;    

  

    uchar* dataDst = imgDst1.data;    

    int stepDst = imgDst1.step;    

    uchar* dataSrc = imgSrc.data;    

    int stepSrc = imgSrc.step;    

    int iWidthSrc = imgSrc.cols;    

    int iHiehgtSrc = imgSrc.rows;   

  

    short cbufy[2];   

    float y_float, x_float;  

    int y_int, x_int;  

    short cbufx[2];   

  

    for (int j=0; j<imgDst1.rows; ++j)    

    {    

        y_float = (float)((j + 0.5) * scale_y - 0.5);    

        y_int = cvFloor(y_float);    

        y_float -= y_int;    

        y_int = std::min(y_int, iHiehgtSrc - 2);    

        y_int = std::max(0, y_int);    

           

        cbufy[0] = cv::saturate_cast<short>((1.f - y_float) * 2048);    

        cbufy[1] = 2048 - cbufy[0];    

  

        for (int i=0; i<imgDst1.cols; ++i)    

        {    

            x_float = (float)((i + 0.5) * scale_x - 0.5);    

            x_int = cvFloor(x_float);    

            x_float -= x_int;    

  

            if (x_int < 0)   

            {    

                x_float = 0, x_int = 0;    

            }    

  

            if (x_int >= iWidthSrc - 1)   

            {    

                x_float = 0, x_int = iWidthSrc - 2;    

            }    

  

               

            cbufx[0] = cv::saturate_cast<short>((1.f - x_float) * 2048);    

            cbufx[1] = 2048 - cbufx[0];    

  

            for (int k = 0; k < imgSrc.channels(); ++k)    

            {    

                *(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + y_int*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[0] +     

                    *(dataSrc + (y_int+1)*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[1] +     

                    *(dataSrc + y_int*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[0] +     

                    *(dataSrc + (y_int+1)*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[1]) >> 22;    

            }    

        }    

    }    

    cv::imwrite("result_1.jpg", imgDst1);    

  

    cv::resize(imgSrc, imgDst2, imgDst1.size(), 0, 0, 1);    

    cv::imwrite("result_2.jpg", imgDst2);    

}  

上述代码为3通道彩图的缩放代码,图片的加载保存用了Opencv的结构体,其余基本保持C的风格;
VS2008+Opencv249下面测试通过,有兴趣的朋友自己试试;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: