双线性插值算法的不足就是细节处理的不好,换句话说,就是曲线拟合得不够光滑,所以又有了双三次插值算法。双三次插值算法是基于周围的16个像素点,通过计算16个像素点的权重,累积得到增加点的像素值的。

简单点理解,公式如下:
p=f(u,v)=∑i=03∑j=03wijxiyjp=f(u,v)=\sum_{i=0}^{3}\sum_{j=0}^{3}w_{ij}x_{i}y_{j} p=f(u,v)=i=0∑3​j=0∑3​wij​xi​yj​
(u,v)为所插入点的坐标,(x,y)为周围16个像素点的坐标。本算法的重点和难点就是权重w的值如何获取。我们取其中的x方向(横轴)分析,wxiw_{xi}wxi​的取值如下公式所示:
wxi={(a+2)∣xi−u∣3−(a+3)∣xi−u∣2+1for∣xi−u∣≤1a∣xi−u∣3−5a∣xi−u∣2+8a∣xi−u∣−4afor1<∣xi−u∣<20otherwisew_{xi}=\left\{\begin{matrix} (a+2)\left | x_i-u \right |^{3}-(a+3)\left | x_i-u \right |^{2}+1 & for & \left | x_i-u \right |\leq 1\\ a\left | x_i-u \right |^{3}-5a\left | x_i-u \right |^{2}+8a\left | x_i-u \right |-4a & for &1< \left | x_i-u \right |< 2 \\ 0 &otherwise \end{matrix}\right. wxi​=⎩⎨⎧​(a+2)∣xi​−u∣3−(a+3)∣xi​−u∣2+1a∣xi​−u∣3−5a∣xi​−u∣2+8a∣xi​−u∣−4a0​forforotherwise​∣xi​−u∣≤11<∣xi​−u∣<2​
同理,也可以得到wyjw_{yj}wyj​,则可以得到权重的表达式如下公式所示:
wij=wxi×wyjw_{ij}=w_{xi}\times w_{yj} wij​=wxi​×wyj​
c++代码实现:
"bmp.h"的头文件代码:bmp图片的类以及读写函数 bmp.h

#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
#include <cstdio>
#include "bmp.h"
using namespace std;
#define DRAW_HEIGHT 512  //目标图像高度
#define DRAW_WIDTH 512  //目标图像宽度
double a=-0.5; //BiCubic基函数void getW_x(double w_x[4],double x);
void getW_y(double w_y[4], double y);int main()
{BMP rbmp;BMP wbmp(DRAW_WIDTH,DRAW_HEIGHT);char strFile[50] = "./lena24.bmp";//打开图像路径,BMP图像必须为24位真彩色格式  char strFilesave[50] = "./test.bmp";//处理后图像存储路径 //读取位图的数据 imread(strFile,rbmp);int width = rbmp.cols();int height = rbmp.rows(); int l_width = WIDTHBYTES(width*24);//计算位图的实际宽度并确保它为4byte的倍数  //写位图的数据int write_width = WIDTHBYTES(DRAW_WIDTH*24);//计算写位图的实际宽度(字节)并确保它为4byte的倍数   /*******************图像处理部分******************/for (int hnum = 2; hnum < DRAW_HEIGHT-4; hnum++){for (int wnum = 2; wnum < DRAW_WIDTH-4; wnum++){double d_original_img_hnum = hnum*height / (double)DRAW_HEIGHT;double d_original_img_wnum = wnum*width / (double)DRAW_WIDTH;int i_original_img_hnum = d_original_img_hnum;//距离最近的点坐标int i_original_img_wnum = d_original_img_wnum;//距离最近的点坐标double w_x[4], w_y[4];//行列方向的加权系数getW_x(w_x, d_original_img_hnum);getW_y(w_y, d_original_img_wnum);int pixel_point = hnum*write_width + wnum * 3;//映射尺度变换图像数组位置偏移量  for(int i=0;i<4;i++){for(int j=0;j<4;j++){int original_point=(i_original_img_hnum+i-1)*l_width + (i_original_img_wnum+j-1)*3;wbmp.pColorData[pixel_point]+=rbmp.pColorData[original_point]*w_x[i]*w_y[j];wbmp.pColorData[pixel_point + 1]+=rbmp.pColorData[original_point+1]*w_x[i]*w_y[j];wbmp.pColorData[pixel_point + 2]+=rbmp.pColorData[original_point+2]*w_x[i]*w_y[j];}}}}/*******************图像处理部分******************/std::cout<<"Done!"<<std::endl;imwrite(strFilesave,wbmp); system("pause"); return 0;
}
/*计算系数*/
void getW_x(double w_x[4],double x){int X = (int)x;//取整数部分double stemp_x[4];stemp_x[0] = 1 + (x - X);stemp_x[1] = x - X;stemp_x[2] = 1 - (x - X);stemp_x[3] = 2 - (x - X);w_x[0] = a*abs(stemp_x[0] * stemp_x[0] * stemp_x[0]) - 5 * a*stemp_x[0] * stemp_x[0] + 8 * a*abs(stemp_x[0]) - 4 * a;w_x[1] = (a + 2)*abs(stemp_x[1] * stemp_x[1] * stemp_x[1]) - (a + 3)*stemp_x[1] * stemp_x[1] + 1;w_x[2] = (a + 2)*abs(stemp_x[2] * stemp_x[2] * stemp_x[2]) - (a + 3)*stemp_x[2] * stemp_x[2] + 1;w_x[3] = a*abs(stemp_x[3] * stemp_x[3] * stemp_x[3]) - 5 * a*stemp_x[3] * stemp_x[3] + 8 * a*abs(stemp_x[3]) - 4 * a;
}
void getW_y(double w_y[4], double y){int Y = (int)y;double stemp_y[4];stemp_y[0] = 1.0 + (y - Y);stemp_y[1] = y - Y;stemp_y[2] = 1 - (y - Y);stemp_y[3] = 2 - (y - Y);w_y[0] = a*abs(stemp_y[0] * stemp_y[0] * stemp_y[0]) - 5 * a*stemp_y[0] * stemp_y[0] + 8 * a*abs(stemp_y[0]) - 4 * a;w_y[1] = (a + 2)*abs(stemp_y[1] * stemp_y[1] * stemp_y[1]) - (a + 3)*stemp_y[1] * stemp_y[1] + 1;w_y[2] = (a + 2)*abs(stemp_y[2] * stemp_y[2] * stemp_y[2]) - (a + 3)*stemp_y[2] * stemp_y[2] + 1;w_y[3] = a*abs(stemp_y[3] * stemp_y[3] * stemp_y[3]) - 5 * a*stemp_y[3] * stemp_y[3] + 8 * a*abs(stemp_y[3]) - 4 * a;
}

效果图:


参考:图像缩放之双三次插值法

图像的放大:双三次插值算法(C++实现)相关推荐

  1. 图像常用的插值算法:最近邻插值、双线性插值和双三次插值算法

    图像常用的插值算法 最近邻插值算法 双线性插值算法 双三次插值(bicubic)算法 三种插值算法的优缺点 插值算法是图像缩放中的一项基本且重要的算法:在图像缩放中,输出图像像素点坐标可能对应输入图像 ...

  2. 三种常见的图像处理双三次插值算法

    三种常见的图像处理双三次插值算法 双立方插值计算涉及16像素,间(i', j')像中的包括 小数部分的像素坐标.dx表示X方向的小数坐标.dy表示Y方向的小数坐标. 详细 能够看下图: 依据上述图示与 ...

  3. 怎么用python编程实现二次差值多项式_双三次插值算法详解 含python实现

    一. 图像双三次插值算法原理: 假设源图像 A 大小为 m*n ,缩放后的目标图像 B 的大小为 M*N .那么根据比例我们可以得到 B(X,Y) 在 A 上的对应坐标为 A(x,y) = A( X* ...

  4. 图像的放大:双线性插值算法(C++实现)

    图像的放大本质上就是增加像素点,目前常用的传统方法是内插法,代表算法有最临近点插值算法.双线性插值算法和双三次插值法,这些算法都是基于相邻像素点的像素值计算所要增加的像素点的像素值,因而在放大时会有失 ...

  5. 图像的放大与缩小(2)——双线性插值放大与均值缩小

    2019独角兽企业重金招聘Python工程师标准>>> 概述 基于上一节"等距采样法"实现图片放大与缩小的缺点.要对其进行改进,对图像的缩小则可以用"局 ...

  6. 图像的放大与缩小——双线性插值放大与均值缩小

    原文地址:http://blog.csdn.net/luoweifu/article/details/8069883 概述 基于上一节"等距采样法"实现图片放大与缩小的缺点.要对其 ...

  7. 双三次插值算法的OpenGL实现

    双三次插值算法的OpenGL实现 说明 最近写一个图像缩放的接口,考虑到自己有现成的OpenGL图像处理引擎,还是直接写shader用GPU实现方便.为了效果好一些,采用了双三次插值算法. 算法相关公 ...

  8. 【Android】自动瘦脸与眼睛放大美颜算法

    自动瘦脸与眼睛放大美颜算法 自动瘦脸与眼睛放大可以算作图像局部扭曲算法的一个应用,其参考文献可以追溯至1993年的一篇博士论文:Interactive Image Warping.这篇论文详细描述了算 ...

  9. 图像增强系列之图像自动去暗角算法

    本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop. 转载自:https://www.cnblogs.com/Imageshop/p/6166394.html    ...

最新文章

  1. 开发日记-20190505 关键词 汇编语言(四) 自定义分级视图demo
  2. codevs1251 括号
  3. 使用 Maven 执行 java main class(java应用程序)
  4. Java常用设计模式————装饰者模式
  5. deepin10安装docker、docker-compose
  6. URL地址编码和解码
  7. k2p 刷breed_斐讯路由器系列「K1-K2-K2P-K2T」-Breed刷入工具v1.1支持XP系统
  8. 电商网站项目总结(面向对象编程篇)
  9. Android Studio中竟然还能加入一个程序员鼓励师
  10. 计算机网络实验:IP协议层分析
  11. 安装ecshop php,如何安装ECSHOP?
  12. 新西兰 计算机 转专业,在留学新西兰以后,半途想转专业怎么办?
  13. 计算机新手必学基础知识,5分钟带你全面了解电脑,新手入门必备知识,值得收藏!...
  14. React H5 使用div自定义简单富文本编辑器
  15. 计算机漫游用户的工作原理,漫游用户配置文件全攻略
  16. 提升方法boosting
  17. SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified
  18. Android蓝牙调试助手
  19. android博客排行榜,新浪博文排行_新浪博客 新浪博客Android客户端
  20. java sql 基础_Java SQL基础

热门文章

  1. Linux下通过mdadm进行软raid设置(rhel6.0)
  2. 区块链(Block Chain)结构解析
  3. 融云 IM 和 RTC 服务,「助攻」智能物流等客户打通链路、完善生态
  4. 活着就为改变世界 -- 目录
  5. 博途(TIA)软件安装教程;博途软件安装常见问题解决办法
  6. .net中,日志组件 Nlog,SerialLog, Log4Net的用法
  7. 基于android开发的简易五子棋游戏(附带学习源码)
  8. linux 安卓 ppsspp,PPSSPP
  9. node.js+vue.js+mysql实现登录注册的功能(前后端分离)
  10. 关于dm-0 dm-1