图像缩放之双三次插值法

图像缩放之双三次插值法今天学习了第三种图像缩放的方法 双三次插值法

今天学习了第三种图像缩放的方法,双三次插值法。由于理解能力比较差,看了好久的公式,还是云里雾里,但是为了督促自己学习,还是把已知的部分记录下来。

数学原理

维基百科的解释

双立方插值说明图

这里写图片描述

参考这里的博客

k_i_0=W(1+u), k_i_1=W(u), k__i_2=W(1-u), k_i_3=W(2-u);
k_j_0=W(1+v), k_j_1=W(v), k_j_2=W(1-v), k_j_3=W(2-v);

程序实现

/10-9* 功能:双三次插值缩放图片 数学原理:假设原图像A的大小为m*n,新图像B的大小为M*N 如果我们要求B(X,Y)处的像素值: 我们首先可以得到B(X,Y)在图像A中对应的位置(x,y)=(X*(m/M),Y*(N/n)) 这个时候求得的x,y是小数值,我们可以通过这个小数值坐标找到距离最近的16个像素点, 利用所选择的基函数,求出对应的每个像素的权值,最终获得pixelB(X,Y) / #include 
    #include 
    #include 
    using namespace std; using namespace cv; float a = -0.5;//BiCubic基函数 void getW_x(float w_x[4], float x); void getW_y(float w_y[4], float y); int main(){ Mat image = imread("lena.jpg");//源图像 float Row_B = image.rows*2; float Col_B = image.cols*2; Mat biggerImage(Row_B, Col_B, CV_8UC3); for (int i = 2; i < Row_B-4; i++){ for (int j = 2; j < Col_B-4; j++){ float x = i*(image.rows / Row_B);//放大后的图像的像素位置相对于源图像的位置 float y = j*(image.cols / Col_B); /*if (int(x) > 0 && int(x) < image.rows - 2 && int(y)>0 && int(y) < image.cols - 2){*/ float w_x[4], w_y[4];//行列方向的加权系数 getW_x(w_x, x); getW_y(w_y, y); Vec3f temp = { 0, 0, 0 }; for (int s = 0; s <= 3; s++){ for (int t = 0; t <= 3; t++){ temp = temp + (Vec3f)(image.at 
  
    ( 
   int(x) + s - 
   1, 
   int(y) + t - 
   1))*w_x[s] * w_y[t]; } } biggerImage.at 
   
     (i, j) = (Vec3b)temp; } } imshow( 
    "image", image); imshow( 
    "biggerImage", biggerImage); waitKey( 
    0); 
    return 
    0; } 
    /*计算系数*/ 
    void getW_x( 
    float w_x[ 
    4], 
    float x){ 
    int X = ( 
    int)x; 
    //取整数部分 
    float 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( 
    float w_y[ 
    4], 
    float y){ 
    int Y = ( 
    int)y; 
    float 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; } 
    
  

注:由于作者编程能力有限,希望有人能指正一下怎么优化这里的程序,这个程序只是实现了算法,运行
速度慢的要死不能忍受!

效果展示

源图像

放大两倍的图像

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215356.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:06
下一篇 2026年3月18日 下午2:06


相关推荐

  • 项目总结 — RFID 读写器上位机软件

    项目总结 — RFID 读写器上位机软件物联网方向的课程项目:RFID读写器上位机软件,是一个基于MFC的软件,通过与连接的设备(这里是读卡器)与IC卡进行数据的交换,举个例子来说:校园卡,公司的门禁卡等等,这个属于物联网的终端信息交互的一个流程。我理解这里主要是两个大的模块:一个是数据的收发,还有一个是界面显示;数据的收发就是通过上位机软件与下位机进行信息的交互,数据的发送具体在项目中就是写卡操作,数据的接收具体在项目中就是读卡操作。

    2022年5月20日
    95
  • OpenClaw本地怎么部署 OpenClaw windos本地部署配置及教程

    OpenClaw本地怎么部署 OpenClaw windos本地部署配置及教程

    2026年3月17日
    2
  • 斯坦福 2025 年 HAI 报告出炉,国产大模型仅讯飞星火入围 Mix-Eval 前十

    斯坦福 2025 年 HAI 报告出炉,国产大模型仅讯飞星火入围 Mix-Eval 前十

    2026年3月14日
    4
  • 大数据分析在职业体育应用

    大数据分析在职业体育应用大数据分析在职业体育应用(NBA)什么是大数据?举个例子,都说骑士队依赖詹姆斯,当詹姆斯在场上时,骑士队每100回合净胜对手6.9分;詹姆斯不在场,骑士队净负对手2.9分,两者之间差值为9.8分。而勇士队的库里在场上和在场下时,勇士队每100回合净胜分的差值为17分,可以说勇士队对库里的依赖甚至要更强。这样的数据才可以叫大数据,相比而言,像得分、篮板、助攻这样的技术统计简直弱爆了。大数据在N…

    2022年5月9日
    86
  • Hex dump_dump数据

    Hex dump_dump数据HexdumpFromWikipedia,thefreeencyclopediaAhexdumpofthe318byteWikipediafaviconIncomputing,ahexdumpisahexadecimalview(onscreenorpaper)ofcomputerdata…

    2026年2月10日
    5
  • 当小样本遇上机器学习 fewshot learning

    当小样本遇上机器学习 fewshot learning引言深度学习(deeplearning)已经广泛应用于各个领域,解决各类问题,例如在图像分类问题下,如图1,区分这10类目标的准确率目前可以轻松做到94%。然而,deeplearning是一种datahungry的技术,需要大量的标注样本才能发挥作用。图1现实世界中,有很多问题是没有这么多的标注数据的,获取标注数据的成本也非常大,例如在医疗领域、安全领域等。因此,我们现在讨论的是…

    2022年4月28日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号