aihot  2017-05-26 21:45:51  OpenCV |   查看评论   

3、双三次:由相邻的4*4像素计算得出,公式类似于双线性

  1. int iscale_x = cv::saturate_cast<int>(scale_x);  
  2. int iscale_y = cv::saturate_cast<int>(scale_y);  
  3.   
  4. for (int j = 0; j < matDst1.rows; ++j)  
  5. {  
  6.     float fy = (float)((j + 0.5) * scale_y - 0.5);  
  7.     int sy = cvFloor(fy);  
  8.     fy -= sy;  
  9.     sy = std::min(sy, matSrc.rows - 3);  
  10.     sy = std::max(1, sy);  
  11.   
  12.     const float A = -0.75f;  
  13.   
  14.     float coeffsY[4];  
  15.     coeffsY[0] = ((A*(fy + 1) - 5*A)*(fy + 1) + 8*A)*(fy + 1) - 4*A;  
  16.     coeffsY[1] = ((A + 2)*fy - (A + 3))*fy*fy + 1;  
  17.     coeffsY[2] = ((A + 2)*(1 - fy) - (A + 3))*(1 - fy)*(1 - fy) + 1;  
  18.     coeffsY[3] = 1.f - coeffsY[0] - coeffsY[1] - coeffsY[2];  
  19.   
  20.     short cbufY[4];  
  21.     cbufY[0] = cv::saturate_cast<short>(coeffsY[0] * 2048);  
  22.     cbufY[1] = cv::saturate_cast<short>(coeffsY[1] * 2048);  
  23.     cbufY[2] = cv::saturate_cast<short>(coeffsY[2] * 2048);  
  24.     cbufY[3] = cv::saturate_cast<short>(coeffsY[3] * 2048);  
  25.   
  26.     for (int i = 0; i < matDst1.cols; ++i)  
  27.     {  
  28.         float fx = (float)((i + 0.5) * scale_x - 0.5);  
  29.         int sx = cvFloor(fx);  
  30.         fx -= sx;  
  31.   
  32.         if (sx < 1) {  
  33.             fx = 0, sx = 1;  
  34.         }  
  35.         if (sx >= matSrc.cols - 3) {  
  36.             fx = 0, sx = matSrc.cols - 3;  
  37.         }  
  38.   
  39.         float coeffsX[4];  
  40.         coeffsX[0] = ((A*(fx + 1) - 5*A)*(fx + 1) + 8*A)*(fx + 1) - 4*A;  
  41.         coeffsX[1] = ((A + 2)*fx - (A + 3))*fx*fx + 1;  
  42.         coeffsX[2] = ((A + 2)*(1 - fx) - (A + 3))*(1 - fx)*(1 - fx) + 1;  
  43.         coeffsX[3] = 1.f - coeffsX[0] - coeffsX[1] - coeffsX[2];  
  44.   
  45.         short cbufX[4];  
  46.         cbufX[0] = cv::saturate_cast<short>(coeffsX[0] * 2048);  
  47.         cbufX[1] = cv::saturate_cast<short>(coeffsX[1] * 2048);  
  48.         cbufX[2] = cv::saturate_cast<short>(coeffsX[2] * 2048);  
  49.         cbufX[3] = cv::saturate_cast<short>(coeffsX[3] * 2048);  
  50.   
  51.         for (int k = 0; k < matSrc.channels(); ++k)  
  52.         {  
  53.             matDst1.at<cv::Vec3b>(j, i)[k] = abs((matSrc.at<cv::Vec3b>(sy-1, sx-1)[k] * cbufX[0] * cbufY[0] + matSrc.at<cv::Vec3b>(sy, sx-1)[k] * cbufX[0] * cbufY[1] +  
  54.                 matSrc.at<cv::Vec3b>(sy+1, sx-1)[k] * cbufX[0] * cbufY[2] + matSrc.at<cv::Vec3b>(sy+2, sx-1)[k] * cbufX[0] * cbufY[3] +  
  55.                 matSrc.at<cv::Vec3b>(sy-1, sx)[k] * cbufX[1] * cbufY[0] + matSrc.at<cv::Vec3b>(sy, sx)[k] * cbufX[1] * cbufY[1] +  
  56.                 matSrc.at<cv::Vec3b>(sy+1, sx)[k] * cbufX[1] * cbufY[2] + matSrc.at<cv::Vec3b>(sy+2, sx)[k] * cbufX[1] * cbufY[3] +  
  57.                 matSrc.at<cv::Vec3b>(sy-1, sx+1)[k] * cbufX[2] * cbufY[0] + matSrc.at<cv::Vec3b>(sy, sx+1)[k] * cbufX[2] * cbufY[1] +  
  58.                 matSrc.at<cv::Vec3b>(sy+1, sx+1)[k] * cbufX[2] * cbufY[2] + matSrc.at<cv::Vec3b>(sy+2, sx+1)[k] * cbufX[2] * cbufY[3] +  
  59.                 matSrc.at<cv::Vec3b>(sy-1, sx+2)[k] * cbufX[3] * cbufY[0] + matSrc.at<cv::Vec3b>(sy, sx+2)[k] * cbufX[3] * cbufY[1] +  
  60.                 matSrc.at<cv::Vec3b>(sy+1, sx+2)[k] * cbufX[3] * cbufY[2] + matSrc.at<cv::Vec3b>(sy+2, sx+2)[k] * cbufX[3] * cbufY[3] ) >> 22);  
  61.         }  
  62.     }  
  63. }  
  64. cv::imwrite("cubic_1.jpg", matDst1);  
  65.   
  66. cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 2);  
  67. cv::imwrite("cubic_2.jpg", matDst2); 

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV中resize函数五种插值算法的实现过程

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]