双线性插值运算实现

双线性插值法(Bilinear Interpolation) python实现双线性插值法(Bilinear Interpolation) 阅读详情

一、原理

双线性插值
在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值[1]。见下图:

è¿éåå¾çæè¿°

假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。最常见的情况,f就是一个像素点的像素值。首先在 x 方向进行线性插值,得到

è¿éåå¾çæè¿°
然后在 y 方向进行线性插值,得到

è¿éåå¾çæè¿°

综合起来就是双线性插值最后的结果:

è¿éåå¾çæè¿°
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。opencv中的源码如下,用了一些优化手段,比如用整数计算代替float(下面代码中的*2048就是变11位小数为整数,最后有两个连乘,因此>>22位),以及源图像和目标图像几何中心的对齐 
SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5 
SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5,

二、C++代码

uchar InterBilinear(float x,float y,cv::Mat &src)
{
	int x_L = cvFloor(x) - 1;
	int x_R = cvFloor(x) + 1;
	int y_T = cvFloor(y) - 1;
	int y_B = cvFloor(y) + 1;

	if (x_L <= 0) x_L = 0;
	else if (x_L >= src.cols - 1) x_L = src.cols - 1;
	if (x_R <= 0) x_R = 0;
	else if (x_R > src.cols - 1) x_R = src.cols - 1;
		
	if (y_T <= 0) y_T = 0;
	else if (y_T > src.rows - 1) y_T = src.rows - 1;
	if (y_B <= 0) y_B = 0;
	else if (y_B > src.rows - 1) y_B = src.rows - 1;

	uchar grayTopL = src.at<uchar>(x_L, y_T);//左上角
	uchar grayTopR = src.at<uchar>(x_R, y_T);//右上角
	uchar grayBottonL = src.at<uchar>(x_L, y_B);//左下角
	uchar grayBottonR = src.at<uchar>(x_R, y_B);//右下角
	//1、计算X方向插值
	float HLscale = 0.f, HRscale = 0.f, VTscale = 0.f, VBscale=0.f;
	HLscale = 1 - (x - x_L) / (x_R - x_L);
	HRscale = 1 - (x_R - x) / (x_R - x_L);
	VTscale = 1 - (y - y_T) / (y_B - y_T);
	VBscale = 1 - (y_B-y) / (y_B - y_T);
	uchar Hpixel1= static_cast<uchar>(grayTopL*HLscale + grayTopR*HRscale);
	uchar Hpixel2 = static_cast<uchar>(grayBottonL*HLscale + grayBottonR*HRscale);
	//计算Y方向插值
	uchar Vpixel = static_cast<uchar>(Hpixel1*VTscale + Hpixel2*VBscale);
	return Vpixel;
}

void ImageZoom(cv::Mat &srcimg, cv::Mat &dst, float scale)
{
	cv::Mat resultimg, grayimg;
	if (scale <= 1e-6)
	{
		cout << "Illegal Parameter!" << endl;
		return;
	}
	if (!srcimg.data)
	{
		cout << "Image Is Null!" << endl;
		return;
	}
	
	grayimg = srcimg.clone();
	int new_width = static_cast<int>(scale*srcimg.cols);
	int new_height = static_cast<int>(scale*srcimg.rows);
	getgrayMat(grayimg);
	resultimg.create(cv::Size(new_width, new_height), grayimg.depth());
	for (int i0 = 0; i0 < new_height; i0++)
	{
		for (int j0 = 0; j0 < new_width; j0++)
		{
				float j1 = (j0+0.1f) / scale;
				float i1 = (i0+0.1f )/ scale;
				if (j1 <= 1e-6)
					j1 = 0.f;
				if (i1 <= 1e-6)
					i1 = 0.f;
				uchar Interval=InterBilinear(i1, j1, grayimg);
				resultimg.at<uchar>(i0, j0) = Interval;
		}
	}
	dst = resultimg.clone();
	resultimg.release();
}
双线性插值的原理和实现 1. 原理介绍 1.1 目标图的像素点与原图之间的投影关系 利用双线性插值构建目标图,需要先将目标图上的像素点投影到原始图像中,并根据原图中周围的四个数据点,从而得到该像素点在目标图上的值。 1.2 如何求得投影点的值 如图所示,双线性插值的目标是在已知红色数据点的前提下求得绿色点的值。 其中:Q11, Q12,Q21,Q22为原图上点,而P点是目标图上像素点在原图上的投影。 根据单线性插值可以得到,上述问题的思路: 先在横轴方向上进行两次线性插值计算(先求R0和R1这两个蓝色. 阅读详情

相关推荐

双线性插值实现图像缩放详解

目录双线性插值(Bilinear Interpolation)线性插值双线性插值深入理解双线性插值我的插值理解代码官方插值办法源图像和目标图像几何中心的对齐将浮点运算转换成整数运算代码效果对比再次深入理解引用 双线性插值(Bilinear Interpolation) 双线性插值是实现上采样的一种手段,关于它的知识其实非常非常简单,但是很多博客写的比较晦涩难懂,这里简单介绍一下双线性插值究竟做了什么。 首先双线性插值是用来放大图像的,但是我们都知道既然要放大图像,其实是对图像的像素进行扩充,而双线性插值就

lyy的博客 1万+

双线性插值原理与实现

在对图像进行空间变换的过程中,典型的情况是在对图像进行放大处理的时候,图像会出现失真的现象。这是由于在变换之后的图像中,存在着一些变换之前的图像中没有的像素位置。为了说明这个问题,不妨假设有一副大小为64x64的灰度图像A,现在将图像放大到256x256,不妨令其为图像B,如图1所示。显然,根据简单的几何换算关系,可以知道B图像中(x,y)处的像素值应该对应着A图像中的(x/4,y/4)处的象素值

李鑫o_O 2932

Python三维图像旋转-基于双线性插值的旋转代码

基于双线性插值的三维图像旋转 不知道双线性插值应用在三维图像上还叫不叫双线性插值。 进入正题,三维图像是用numpy数组存储的三维矩阵。 三维图像旋转的基础: 这个T就是变换矩阵,当其分别绕X、Y、Z轴旋转的时候,T分别为: 但是呢,这里有一个问题,一般来说我们会想把我们的图像绕着图像的中心旋转,但是如果你直接套用上面的公式的话会发现图像时绕着x轴,y轴和z轴旋转的,所以...

zhangyugebb的博客 6519

双线性插值的实现

双线性插值根据周围4个点及与4个点的距离,来计算待插值像素的值 http://baike.baidu.com/link?url=4it85nPzCC9J0oZZGU7HEGuXbcDcOmzhtKuwTP9Nar9HLRyZdwKaocnn1yZOFJ7pdZjnXmTUpiKStH5nPs1qTq2V57th0nHQqc1m0_fzQXIklY4hFLnYg3T5kbqTibxqIU...

ba63611035的博客 289

【鸿蒙南向开发】OpenHarmony——分布式数据对象之功能实践

通过本文的学习可了解到分布式数据对象的主要接口、大致调用方法和功能实现等。结合对应内容,可以进一步对分布式数据对象同步机制做深度学习。下一步,(1) 着重理解同步组网的构建原理。(2) 着重理解同步组网内,监听change和status变化的实现。●如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:●关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。

HarmonyOS_666的博客 1092

万达电影 com.wandafilm.app headers check

万达电影 安卓逆向 抓包 逆向 check

weixin_43786514的博客 1438

插值法(最邻近,双线性,双三次)的原理及实现

插值法(最邻近,双线性,双三次)的原理及实现 常用的插值方法有最邻近插值法、双现象插值法和双三次插值法等,主要用于图像的放大或缩小。 缩小图像(或称为下采样(subsampled) 或降采样(downsampled) ) 的主要目的有两个: 1、 使得图像符合显示区域的大小; 2、 生成对应图像的缩略图。 放大图像(或称为上采样(upsampling) 或图像插值(interpolating) ) 的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。 一、最邻近插值法 最邻近插值(The near

weixin_40163266的博客 2万+

性能测试软件(LR12) 具体汉化(中文)方法

LoadRunner 12 的下载及安装详细过程请参考:https://blog.youkuaiyun.com/xiao66guo/article/details/105465854 1、在LoadRunner文件中找到 Setup.exe 可执行文件,并以管理员的身份运行: C盘 —> Temp—>HP LoadRunner 12.02 Community Edition—> D...

多谢大人光临寒舍,请随便看看,喝口茶吧 ☕️☕️☕️ 1993

双线性插值的Python实现(采用矩阵运算,无for循环)

最近写深度学习网络需要对feature map进行双线性插值,opencv的resize不能对图像进行批处理,网上找到的双线性插值的代码基本都是三重for循环实现的,效率太低下,干脆自己用numpy库的矩阵运算实现了一个。 双线性插值原理参考: https://zhuanlan.zhihu.com/p/112030273 感谢大佬Orz。 import numpy as np def bilinear_interpolate(source, scale=2, pad=0.5): sour_sh

qq_37931219的博客 2805

Qt5.15.2配置安卓环境

否则,将会跳转到github,你可以自行下载解压到你设置的目录中,然后Qt会自动检测到。以上所需的工具确实有些繁多,而且如果单独下载又涉及科学上网问题,版本问题十分麻烦,好在Qt Creator 4.12之后已经可以自动下载SDK工具,NDK,基础包,openssl,以及gradle等,十分省心。回到正题,无论通过在线安装的方式,安装时勾选了Android,还是编译的方式,编译时编译了Qt Android库,想要使用Qt开发安卓应用仍然需要一些其他工作,包括安装编译安卓项目需要的SDK,NDK等。

weixin_41392061的博客 979

数学建模算法案例精讲500篇-【深度强化学习】深度确定性策略梯度(DDPG)(附MATLAB和python代码实现)

它是一种学习连续动作的无模型策略算法。它结合了DPG(确定性策略梯度)和DQN(深度Q网络)的思想。它利用DQN中的经验重放和延迟更新的目标网络,并基于DPG,可以在连续的动作空间上运行。# 用于生成带有噪声的动作def __init__(self, action_space, mu=0.0, theta = 0.15, max_sigma = 0.3, min_sigma = 0.3, decay_period = 100000):#decay_period要根据迭代次数合理设置# 均值 mu。

qq_36130719的博客 325

双线性插值运算的CUDA实现

双线性插值运算的cuda实现

MM__1997的博客 2397

Vue2 - 详细实现解析Markdown内容生成侧边栏Toc目录索引,识别文章内容根据大标题/小标题自动生成多级文章目录,点击目录导航时跳转到文章内容对应的锚点位置带过渡动画,滑过锚点时高亮对应标题

vue2,nuxt2,Markdown,目录,文章目录锚点,滚动高亮导航文字,根据页面滚动高亮显示目录的侧边栏,自动提取标题生成右侧目录,vuemarkdown解析并生成目录,滚动页面的时候文章目录跟着选中效果,侧边栏滚动跟随页面,右边目录固定,左边内容可以滚动并且与左边目录联动,实现监听滚动,锚点定位,文章目录滚动跟随高亮,右边菜单点击目录滚动到对应标题,报错,渲染失败,文章内容,读取#标题符号,自动生成一个目录树,自动生成Toc目录,博客内容生成目录索引,资讯文章,生成锚点目录树TOC,详细示例代码教

🏆 前端领域优质创作者 3671

2实现双线性插值_双线性插值(采用矩阵运算,无for循环)

最近写深度学习网络需要对feature map进行双线性插值,opencv的resize不能对图像进行批处理,网上找到的双线性插值的代码基本都是三重for循环实现的,效率太低下,干脆自己用numpy库的矩阵运算实现了一个。双线性插值原理参考:saulzhang:grid_sample()函数及双线性采样​zhuanlan.zhihu.com感谢大佬Orz。import numpy as np d...

weixin_39594439的博客 346

深入大模型-19-Windows10中安装OpenClaw-CN配置接入智谱免费大模型

OpenClaw CN (中国社区版) 是 OpenClaw 的本地化维护版本,针对国内网络环境进行了深度优化,源码级原生支持 DeepSeek/Qwen 等国产大模型,致力于让中国开发者拥有最顺滑的 Agent 开发体验。

qq_20466211的博客 771

OpenClaw人人养虾:接入Synology Chat

Synology Chat 是群晖 NAS(Network Attached Storage,网络附属存储)内置的即时通讯应用。

王国平的博客 781

resize接口实现之-------双线性插值法解读

1、resize 原理 OpenCV2.4.9中,cv::resize函数有五种插值算法:最近邻、双线性(默认方式)、双三次、基于像素区域关系、兰索斯插值。 void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINE...

u011473714的专栏 4969

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

双线性插值的python实现

双线性插值 参考链接: https://gitee.com/angerial/opencv/blob/master/interpolation/bilinear_interpolation.py 代码: import cv2 import numpy as np def bilinear_interpolation(img, out_dim): src_h, src_w, channel = img.shape # 原图片的高、宽、通道数 dst_h, dst_w = out_dim

明德zhuang 7463

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

python双线性插值函数_OpenCV ——双线性插值(Bilinear interpolation)

1,原理在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。越是简单的模型越适合用来举例子,我们就举个简单的图像:3*3 的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):234 38 2267 ...

weixin_39600704的博客 2688

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

图像处理—双线性插值法

一、双线性插值法 假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。 显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。如果你的对应坐标是(2.5,4.5),那么最近的四个像素是(2,4

weixin_45492636的博客 4384

图像处理界双线性插值算法的优化

在图像处理中,双线性插值算法的使用频率相当高,比如在图像的缩放中,在所有的扭曲算法中,都可以利用该算法改进处理的视觉效果。首先,我们看看该算法的简介。      在数学上,双线性插值算法可以看成是两个变量间的线性插值的延伸。执行该过程的关键思路是先在一个方向上执行线性插值,然后再在另外一个方向上插值。下图示意出这个过程的大概意思。      用一个简单的数学表达式可以表示如下:     

shangyaowei的专栏 732

FPGA双线性插值算法(图像的缩放)

 在FPGA实现图像双线性插值,比较复杂。结果验证和 FPGA自带的效果差不多。占的资源比较少。           双线性插值的框架图:         双线性插值的运算单元: 这样就可以实现视频的缩放。

messi_cyc的专栏 5127

双线性插值 一文全讲解

1、原理 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。   越是简单的模型越适合用来举例子,我们就举个简单的图像:33 的256级灰度图。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source): 234 38 22 67 4...

bupt_cy 2109

【图像处理】快速双线性插值

前言 图像缩放是最常用的图像操作,最近实现了一次双线性插值,适用于单通道8位灰度图像,可以同时处理缩小,放大。 加速手段有三个:1) 使用可分离方式,先后处理行和列, 2)构建缓冲区,以避免对某些行重复插值。3) 使用整形运算,避免浮点运算。 代码 typedef struct _Image{ int w; int h; int c; int ...

weixin_30502965的博客 115

寒假之视频压缩笔记——FPGA双线性插值算法(图像的缩放)

原创:https://blog.youkuaiyun.com/angelbosj/article/details/50708677 在FPGA实现图像双线性插值,比较复杂。结果验证和 FPGA自带的效果差不多。占的资源比较少。   双线性插值的框架图: 双线性插值的运算单元: 这样就可以实现视频的缩放。    ...

fighting2019的博客 1567
上一篇: 尺度不变特征变换匹配算法详解
下一篇: pip配置darkflow+yolo环境:win10+darkflow+yolo
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值