1. 程式人生 > >雙線性插值Code

雙線性插值Code

http://blog.csdn.net/carson2005/article/details/50460088


  1. void ImgResize_BiLinear()  
  2. {  
  3.     cv::Mat imgSrc, imgDst1, imgDst2;    
  4.   
  5.     imgSrc = cv::imread("test.jpg"
    );    
  6.     imgDst1 = cv::Mat(cv::Size(imgSrc.cols*2, imgSrc.rows*2), imgSrc.type(), cv::Scalar::all(0));    
  7.     imgDst2 = cv::Mat(imgDst1.size(), imgSrc.type(), cv::Scalar::all(0));    
  8.   
  9.     double scale_x = (double)imgSrc.cols / imgDst1.cols;    
  10.     double scale_y = (double)imgSrc.rows / imgDst1.rows;    
  11.   
  12.     uchar* dataDst = imgDst1.data;    
  13.     int stepDst = imgDst1.step;    
  14.     uchar* dataSrc = imgSrc.data;    
  15.     int stepSrc = imgSrc.step;    
  16.     int iWidthSrc = imgSrc.cols;    
  17.     int iHiehgtSrc = imgSrc.rows;   
  18.   
  19.     short cbufy[2];   
  20.     float y_float, x_float;  
  21.     int y_int, x_int;  
  22.     short cbufx[2];   
  23.   
  24.     for (int j=0; j<imgDst1.rows; ++j)    
  25.     {    
  26.         y_float = (float)((j + 0.5) * scale_y - 0.5);    
  27.         y_int = cvFloor(y_float);    
  28.         y_float -= y_int;    
  29.         y_int = std::min(y_int, iHiehgtSrc - 2);    
  30.         y_int = std::max(0, y_int);    
  31.            
  32.         cbufy[0] = cv::saturate_cast<short>((1.f - y_float) * 2048);    
  33.         cbufy[1] = 2048 - cbufy[0];    
  34.   
  35.         for (int i=0; i<imgDst1.cols; ++i)    
  36.         {    
  37.             x_float = (float)((i + 0.5) * scale_x - 0.5);    
  38.             x_int = cvFloor(x_float);    
  39.             x_float -= x_int;    
  40.   
  41.             if (x_int < 0)   
  42.             {    
  43.                 x_float = 0, x_int = 0;    
  44.             }    
  45.   
  46.             if (x_int >= iWidthSrc - 1)   
  47.             {    
  48.                 x_float = 0, x_int = iWidthSrc - 2;    
  49.             }    
  50.   
  51.                
  52.             cbufx[0] = cv::saturate_cast<short>((1.f - x_float) * 2048);    
  53.             cbufx[1] = 2048 - cbufx[0];    
  54.   
  55.             for (int k = 0; k < imgSrc.channels(); ++k)    
  56.             {    
  57.                 *(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + y_int*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[0] +     
  58.                     *(dataSrc + (y_int+1)*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[1] +     
  59.                     *(dataSrc + y_int*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[0] +     
  60.                     *(dataSrc + (y_int+1)*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[1]) >> 22;    
  61.             }    
  62.         }    
  63.     }    
  64.     cv::imwrite("result_1.jpg", imgDst1);    
  65.   
  66.     cv::resize(imgSrc, imgDst2, imgDst1.size(), 0, 0, 1);    
  67.     cv::imwrite("result_2.jpg", imgDst2);    
  68. }  

上述程式碼為3通道彩圖的縮放程式碼,圖片的載入儲存用了Opencv的結構體,其餘基本保持C的風格;

VS2008+Opencv249下面測試通過,有興趣的朋友自己試試;



  1. void ImgResize_BiLinear()  
  2. {  
  3.     cv::Mat imgSrc, imgDst1, imgDst2;    
  4.   
  5.     imgSrc = cv::imread("test.jpg");    
  6.     imgDst1 = cv::Mat(cv::Size(imgSrc.cols*2, imgSrc.rows*2), imgSrc.type(), cv::Scalar::all(0));    
  7.     imgDst2 = cv::Mat(imgDst1.size(), imgSrc.type(), cv::Scalar::all(0));    
  8.   
  9.     double scale_x = (double)imgSrc.cols / imgDst1.cols;    
  10.     double scale_y = (double)imgSrc.rows / imgDst1.rows;    
  11.   
  12.     uchar* dataDst = imgDst1.data;    
  13.     int stepDst = imgDst1.step;    
  14.     uchar* dataSrc = imgSrc.data;    
  15.     int stepSrc = imgSrc.step;    
  16.     int iWidthSrc = imgSrc.cols;    
  17.     int iHiehgtSrc = imgSrc.rows;   
  18.   
  19.     short cbufy[2];   
  20.     float y_float, x_float;  
  21.     int y_int, x_int;  
  22.     short cbufx[2];   
  23.   
  24.     for (int j=0; j<imgDst1.rows; ++j)    
  25.     {    
  26.         y_float = (float)((j + 0.5) * scale_y - 0.5);    
  27.         y_int = cvFloor(y_float);    
  28.         y_float -= y_int;    
  29.         y_int = std::min(y_int, iHiehgtSrc - 2);    
  30.         y_int = std::max(0, y_int);    
  31.            
  32.         cbufy[0] = cv::saturate_cast<short>((1.f - y_float) * 2048);    
  33.         cbufy[1] = 2048 - cbufy[0];    
  34.   
  35.         for (int i=0; i<imgDst1.cols; ++i)    
  36.         {    
  37.             x_float = (float)((i + 0.5) * scale_x - 0.5);    
  38.             x_int = cvFloor(x_float);    
  39.             x_float -= x_int;    
  40.   
  41.             if (x_int < 0)   
  42.             {    
  43.                 x_float = 0, x_int = 0;    
  44.             }    
  45.   
  46.             if (x_int >= iWidthSrc - 1)   
  47.             {    
  48.                 x_float = 0, x_int = iWidthSrc - 2;    
  49.             }    
  50.   
  51.                
  52.             cbufx[0] = cv::saturate_cast<short>((1.f - x_float) * 2048);    
  53.             cbufx[1] = 2048 - cbufx[0];    
  54.   
  55.             for (int k = 0; k < imgSrc.channels(); ++k)    
  56.             {    
  57.                 *(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + y_int*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[0] +     
  58.                     *(dataSrc + (y_int+1)*stepSrc + 3*x_int + k) * cbufx[0] * cbufy[1] +     
  59.                     *(dataSrc + y_int*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[0] +     
  60.                     *(dataSrc + (y_int+1)*stepSrc + 3*(x_int+1) + k) * cbufx[1] * cbufy[1]) >> 22;    
  61.             }    
  62.         }    
  63.     }    
  64.     cv::imwrite("result_1.jpg", imgDst1);    
  65.   
  66.     cv::resize(imgSrc, imgDst2, imgDst1.size(), 0, 0, 1);    
  67.     cv::imwrite("result_2.jpg", imgDst2);    
  68. }  

上述程式碼為3通道彩圖的縮放程式碼,圖片的載入儲存用了Opencv的結構體,其餘基本保持C的風格;

VS2008+Opencv249下面測試通過,有興趣的朋友自己試試;