首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >常用图像插值方法概述

常用图像插值方法概述

作者头像
音视频开发进阶
发布于 2021-05-10 07:55:22
发布于 2021-05-10 07:55:22
2K00
代码可运行
举报
运行总次数:0
代码可运行

缘由

之前我在公司做了一个在JNI层缩放Bitmap的需求。

需求本身很简单,就是按各种比例缩小或者放大图像,要求缩放后无明显锯齿,不失真。

很容易就想到了双线性插值算法,于是在Github上找了开源代码。即

https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations

里的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Java_com_jni_bitmap_1operations_JniBitmapHolder_jniScaleBIBitmap

这个Github项目的历史有6年了,也有接近500的star。但接入后还是觉得效果不如预期,有时候失真严重。后来发现是因为函数实现里的几行代码逻辑有问题。于是向作者提了PullRequest, 已经被merge了。

拓展

传统的图像插值算法主要有以下几种:最邻近插值 / 双线性插值 / 双三次插值 / lanczos插值。以上算法效果按顺序越来越好,但计算量也是越来越大。

最邻近插值法

效果上比较粗糙,容易失真

实现最简单,就是取最接近插值点的像素的值。

双线性插值法

效果上比较平滑

在X和Y方向分别进行一次线性插值, 采样点的权重与和插值点的距离负相关。

设要插值的像素坐标为(X.a,Y.y), 大写和小写分别表示坐标的整数部分和小数部分,f(x)为读取像素值的函数,那么双线性插值的结果为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f(X.x,Y.y) = [(1-x)*f(X,Y) + x*f(X+1,Y)](1-y) + [(1-x)*f(X,Y+1) + x*f(X+1,Y+1)]y
           = (1-x)(1-y)*f(X,Y) + x(1-y)*f(X+1,Y) + (1-x)y*f(X,Y+1) + xy*f(X+1,Y+1) 

可以观察到,采样点的权重就是横向权重与纵向权重的乘积。

由于效果和耗时都适中,所以应用广泛,比如OpenGL里的GL_LINEAR就是双线性过滤的意思。

双线性插值图示

双三次插值法

效果上比双线性插值更少锯齿, 更平滑

比双线性的采样点更多,即取插值点周围的16个采样点的加权平均求得插值点的像素值。并且计算权重的过滤函数是三次多项式。

三线性插值图示

采样的过程可以用矩阵乘法表示如下

bicubic插值矩阵表示

其中i,j是坐标的整数部分。v,u是坐标的小数部分。f(x)为读取像素的函数。S(x)为权重函数。

而权重函数的公式为:

其中a的取值说明如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  -0.5 三次Hermite样条
  -0.75 常用值
  -1 逼近y = sin(x*PI)/(x*PI)
  -2 常用值

权重函数对应的图像如下

lanczos插值

效果上比双三次插值更清晰锐利。但在图像的高频信号区域(像素值陡变的地方,比如素描的线条边缘),会有振铃效应(Ringing Artifact), 这种情况下建议改用双线性过滤

原理和双三次插值法差不多。插值卷积核尺寸为4*4时,计算过程对应的矩阵表示和上面的bicubic插值矩阵表示一样。

计算权重的函数如下:

其中a = kernelWidth * 0.5。即在卷积核为4 * 4时, a= 2

权重函数对应的图像如下

Lanczos和双三次插值的耗时, 是双线性插值的2倍左右, 这个性能在绝大多数移动端场景下都是OK的。

其他补充

OpenGL领域还有MipMap三线性过滤法 GL_LINEAR_MIPMAP_LINEAR。

也可以接入FFmpeg直接使用libswscale库里的各种过滤算法。

开源库OpenCV也提供了各种图像插值算法的C++实现。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频开发进阶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL 中三个常见的问题解决
因为长时间未使用 MySql 导致忘记了 root 密码,现在将修改 root 用户密码的方法记录下来。
zucchiniy
2020/05/22
8110
MySQL入门03:MySQL修改root密码的方法
作为守护数据库安全的第一道关卡是root账户及其密码。 学会对root密码管理无疑是守门人和开锁人的一项基础技能。
SQLplusDB
2022/08/19
3.4K0
MySQL root密码忘记,原来还有更优雅的解法!
一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables。
星哥玩云
2022/08/16
3950
数据库:MySQL 修改密码
编辑/etc/my.cnf,在配置表后方加入“skip-grant-tables”,意思是跳过跳过授权表,即不再坚定账号密码的正确性,使用service mysqld restart重启mysql,输入mysql -uroot -p,直接回车进入数据库命令行。
全栈程序员站长
2022/09/13
18.7K0
数据库:MySQL 修改密码
使用MySQL community 源安装MySQL
shaonbean
2018/01/02
1.8K0
Linux 环境下 MySQL 5.7 root密码忘记-解决方法
输入密码后提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
zinyan.com
2022/12/07
1.7K0
Centos7.3 安装Mysql5.7并修改初始密码
http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
Javen
2018/08/21
2.3K0
Centos7.3 安装Mysql5.7并修改初始密码
Linux安装MySql5.7——在centos7中与MySQL5.7安装的相恨相杀
CentOS7的yum源中默认好像是没有mysql的。为了解决这个问题,我们要先下载mysql的repo源。(注意root用户权限问题)
不愿意做鱼的小鲸鱼
2022/09/26
7780
Linux安装MySql5.7——在centos7中与MySQL5.7安装的相恨相杀
MySQL编译安装时常见错误分析
这篇文章主要是关于MySQL在编译安装时,可能出现的错误的解决方法。MySQL正确的编译安装操作见前文《2015博客升级记(四):CentOS 7.1编译安装MySQL5.7.7rc》。
typecodes
2024/03/29
5390
MySQL编译安装时常见错误分析
linux下mysql忘记密码
今天在服务器安装mysql之后,登录发现密码错误,但是我没有设置密码呀,最后百度之后得知,mysql在5.7版本之后会自动创建一个初始密码。 报错如下:
kirin
2020/06/12
6.5K0
【MySQL】mysql忘记root密码
① # vim /etc/my.cnf 在[mysqld]下添加skip-grant-tables,然后保存并退出 ② 重启mysql服务:service mysqld restart ③ 执行 mysql 命令进入数据库,修改数据库密码 MySQL> UPDATE mysql.user SET Password=PASSWORD('新密码') where USER='root'; 如果是MySQL5.7,需要改为MySQL> UPDATE mysql.user SET authentication_string=PASSWORD('新密码') where USER='root'; mysql> flush privileges; ④ 把/etc/my.cnf中的skip-grant-tables注释掉,然后重启mysql, 即:service mysqld restart ⑤ 下面就可以用root新的密码登录了
用户5522200
2019/06/02
5.9K0
忘记MySQL/MariaDB root密码的解决方法
MySQL/MariaDB 的root 密码忘了,不知道改怎么办,下面是修改root 密码步骤。
星哥玩云
2022/08/18
1.2K0
MySQL8.0使用skip-grant-tables
在忘记MySQL密码的时候,会使用skip-grant-tables选项,下面记录一下在MySQL8.0环境中使用skip-grant-tables的情况。
云鹏
2021/05/20
5.4K0
腾讯云服务器Linux系统--安装MySql
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
营琪
2019/11/04
37.7K1
mysql8修改root的密码(如何查看自家wifi密码)
1. 正常启动MYSQL服务后,敲Linux中root账户和密码进入不去。
全栈程序员站长
2022/07/29
3K0
mysql8修改root的密码(如何查看自家wifi密码)
MySQL忘记root密码处理
如果忘记密码,对于MySQL而言处理起来也相对比较简单。但需要修改配置,重启数据库。可以按照如下步骤处理。
俊才
2020/01/17
4.6K0
Mysql 5.7更改密码
如果MySQL数据库用户的密码设置过于简单,数据库在用户登录后会提示重置密码,并且不接受简单的密码。
用户5760343
2022/05/23
4.7K0
windows 10下载安装mysql5.7
MySQL数据库在日常使用是非常的频繁的,不管是线上还是线下。下面我就分享出我安装MySQL5.7的一步一脚印的教程,本教程只针对windows版本。
共饮一杯无
2022/11/24
6980
windows 10下载安装mysql5.7
MySQL5.7修改密码问题解决方案
mysqladmin:无法更改密码;错误:“您的密码不符合当前策略要求” Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. mysqladmin: unable to change password; error: ‘Your password does not satisfy the current policy requirements’
猫头虎
2024/04/07
2760
MySQL5.7修改密码问题解决方案
mysql5.7密码策略及修改技巧
MySQL5.7为root用户随机生成了一个密码,打印在error_log中,关于error_log的位置,如果安装的是RPM包,则默认是 /var/log/mysqld.log 。 于是我们可以在mysqld.log中找到初始密码串:
尾尾部落
2018/09/04
3.3K0
mysql5.7密码策略及修改技巧
相关推荐
MySQL 中三个常见的问题解决
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档