热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

y等于ax的平方加bx加c的图像(已知yax2十bx十c图像)

讲插值之前,首先讲像素重采样的概念。假设有图像A和图像B,其中A为源图像,B为目标图像,A与B的坐标具有对应关系f:(xa,yaf(xb,yb通过关系f,把A的像素值赋值给B中


在讨论插值之前,我们先来谈谈像素重采样的概念。假设有图像A和B,其中A为源图像,B为目标图像,A和B的坐标有对应关系F:


(xa,ya)=f(xb,yb)


通过关系F将A的像素值赋给B中对应像素点的过程称为图像A的像素重采样,图像B为重采样后的图像。例如,对于B的任意像素点(x,y),A的对应像素点为(x’,y’),则A中点(x’,y’)的像素值A(x’,y’)赋给B中点(x,y)的像素值B (x,y)。


(x ',y')=f(x,y)


B(x,y)=A(x ',y ')


像素重采样的常见应用场景是图像缩放和图像配准。在实际应用中,源图像A的对应坐标往往不是整数,而是浮点数据(如下图所示),因此像素值不能直接赋给目标图像上的对应点。这时,要得到点A(x’,y’)的像素值,插值算法就派上用场了。




插值是利用浮点坐标点周围整数点的像素值来计算浮点坐标点的像素值。例如,在上图中,点(x’,y’)是一个浮点坐标点,它的像素值A(x’,y’)是利用它周围的整数点p0、p1、p2和p3的像素值计算出来的。这个过程就是插值。


常见的插值算法包括最近邻插值、双线性插值和双三次插值。无论什么插值算法,其本质都是取浮点坐标点周围n*n个整数坐标点的像素值进行加权求和,从而得到浮点坐标点的像素值,如下:




不同插值算法的区别在于权重w的计算方式不同。下面将详细解释最近邻插值、双线性插值和双三次插值的计算原理和实现。


1.最近邻插值


最近插值以离浮点坐标点最近的点的像素值作为其像素值,也可以认为是利用浮点坐标点周围2*2个整数点的像素值计算其像素值,但只有最近的点权重为1,其他三个点的权重系数均为0。




插值计算如下:




重量计算如下:




最近邻插值的代码实现是最简单的。直接舍入浮点坐标就可以了。假设浮点坐标为(x_float,y_float),使用最近邻插值计算A(x_float,y_float)的代码实现如下:


int x=(int)(x _ float 0.5);//加0.5然后截断取整,相当于取整。


int y=(int)(y _ float 0.5);


ucharinner _ value=a . ptruchar(y)[x];//A(x ',y')=A(x,y)


2.双线性插值


双线性插值类似于最近邻插值。它还使用浮点坐标点周围2*2个整数点的像素值来计算它的像素值,但是它周围每个整数点的权重不是0,也就是说它的权重计算不同于最近邻插值:

mg.com/origin/pgc-image/cb274874e3ee4b2393939bf25771208b?from=pc">

浮点坐标点(x_float, y_float)双线性插值的代码实现如下:

int x0 = floor(x_float);
int x1 = x0 + 1;
int y0 = floor(y_float);
int y1 = y0 + 1;
float fracRow = y_float - y0;  //求浮点坐标的小数部分
float fracCol = x_float - x0;
float k0 = 1.0 - fracRow;
float k1 = 1.0 - fracCol;
float w0 = k0*k1;
float w1 = fracRow*k1;
float w2 = k0*fracCol;
float w3 = fracRow*fracCol;
uchar inner_value = (uchar)(w0 * A.ptr(y0)[x0] + w1 * A.ptr(y1)[x0] + w2 * A.ptr(y0)[x1] + w3 * A.ptr(y1)[x1]);

3. 双三次插值

双三次插值使用浮点型坐标点周围4*4个整型点的像素值来计算其像素值,如下图所示:

浮点型坐标点的插值为其周围4*4整型坐标点像素值的加权和:

其中权重W(i,j)的计算如下式,其中a取值范围-1~0之间,一般取固定值-0.5。

双三次插值的实现代码如下。

首先是权重函数的实现:

float cubic_coeff(float x, float a)
{
if(x <= 1)
{
return 1-(a+3)*x*x+(a+2)*x*x*x;
}
else if(x <2)
{
return -4*a+8*a*x-5*a*x*x+a*x*x*x;
}
    return 0.0;
}

接着是权重系数的计算实现:

void cal_cubic_coeff(float x, float y, float *coeff)
{
/*calc the coeff*/
    float u = x - floor(x);
    float v = y - floor(y);

u += 1;
v += 1;
    float a = -0.15;
float a_mul_4 = (a + a) + (a + a);
float a_mul_5 = a_mul_4 + a;
float a_mul_8 = a_mul_4 + a_mul_4;
float a_add_3 = a + 3;
   float a_add_2 = a + 2;
float A[4];
A[0] = cubic_coeff(abs(u), a);
A[1] = cubic_coeff(abs(u-1), a);
A[2] = cubic_coeff(abs(u-2), a);
A[3] = cubic_coeff(abs(u-3), a);
for (int s = 0; s <4; s++)
   {
float C = cubic_coeff(abs(v-s), a);
coeff[s*4] = A[0]*C;
coeff[s*4+1] = A[1]*C;
coeff[s*4+2] = A[2]*C;
coeff[s*4+3] = A[3]*C;
}
}

最后,是双三次插值代码:

uchar cubic_inner(Mat A, float x_float, float y_float, float a)
{
float coeff[16];
cal_cubic_coeff(x_float, y_float, coeff); //计算权重系数

float sum = 0.0;
int x0 = floor(x_float) - 1;
   int y0 = floor(y_float) - 1;
   
for(int i = 0; i <4; i++)
{
      for(int j = 0; j < 4; j++)
{
           sum += coeff[i*4+j]*A.ptr(y0+i)[x0+j];
}
}

uchar inner_value = (uchar)sum;
   return inner_value;
}

从插值效果来说:双三次插值>双线性插值>最邻近插值,从计算复杂度来说,同样是:双三次插值>双线性插值>最邻近插值。所以实际使用时,根据自己的需要选择合适的插值算法。


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了汉诺塔问题的迭代算法实现,通过递归的方式将盘子从一个地方搬到另一个地方,并打印出移动的顺序。详细介绍了算法的思路和步骤,以及示例代码的运行结果。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
温暖不醒的aprildRi-1965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有