经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理。以前一直很懒,懒得测试和甄别应该使用哪种算法,最近的工作时间,很多时候需要等待别人。忙里偷闲,对ffmpeg的这一组函数进行了一下封装,顺便测试了一下各种算法。

简单说一下测试环境,我使用的是Dell的品牌机,i5的CPU。ffmpeg是2010年8月左右的当时最新版本编译而成,我使用的是其静态库版本。

sws_scale的算法有如下这些选择。

#define SWS_FAST_BILINEAR     1
#define SWS_BILINEAR          2
#define SWS_BICUBIC           4
#define SWS_X                 8
#define SWS_POINT          0x10
#define SWS_AREA           0x20
#define SWS_BICUBLIN       0x40
#define SWS_GAUSS          0x80
#define SWS_SINC          0x100
#define SWS_LANCZOS       0x200
#define SWS_SPLINE        0x400

首先,将一幅1920*1080的风景图像,缩放为400*300的24位RGB,下面的帧率,是指每秒钟缩放并渲染的次数。(经过我的测试,渲染的时间可以忽略不计,主要时间还是耗费在缩放算法上。)

算法

帧率

图像主观感受

SWS_FAST_BILINEAR

228

图像无明显失真,感觉效果很不错。

SWS_BILINEAR

95

感觉也很不错,比上一个算法边缘平滑一些。

SWS_BICUBIC

80

感觉差不多,比上上算法边缘要平滑,比上一算法要锐利。

SWS_X

91

与上一图像,我看不出区别。

SWS_POINT

427

细节比较锐利,图像效果比上图略差一点点。

SWS_AREA

116

与上上算法,我看不出区别。

SWS_BICUBLIN

87

同上。

SWS_GAUSS

80

相对于上一算法,要平滑(也可以说是模糊)一些。

SWS_SINC

30

相对于上一算法,细节要清晰一些。

SWS_LANCZOS

70

相对于上一算法,要平滑(也可以说是模糊)一点点,几乎无区别。

SWS_SPLINE

47

和上一个算法,我看不出区别。

总评,以上各种算法,图片缩小之后的效果似乎都不错。如果不是对比着看,几乎看不出缩放效果的好坏。上面所说的清晰(锐利)与平滑(模糊),是一种客观感受,并非清晰就比平滑好,也非平滑比清晰好。其中的Point算法,效率之高,让我震撼,但效果却不差。此外,我对比过使用CImage的绘制时缩放,其帧率可到190,但效果惨不忍睹,颜色严重失真。

第二个试验,将一幅1024*768的风景图像,放大到1920*1080,并进行渲染(此时的渲染时间,虽然不是忽略不计,但不超过5ms的渲染时间,不影响下面结论的相对准确性)。

算法

帧率

图像主观感受

SWS_FAST_BILINEAR

103

图像无明显失真,感觉效果很不错。

SWS_BILINEAR

100

和上图看不出区别。

SWS_BICUBIC

78

相对上图,感觉细节清晰一点点。

SWS_X

106

与上上图无区别。

SWS_POINT

112

边缘有明显锯齿。

SWS_AREA

114

边缘有不明显锯齿。

SWS_BICUBLIN

95

与上上上图几乎无区别。

SWS_GAUSS

86

比上图边缘略微清楚一点。

SWS_SINC

20

与上上图无区别。

SWS_LANCZOS

64

与上图无区别。

SWS_SPLINE

40

与上图无区别。

总评,Point算法有明显锯齿,Area算法锯齿要不明显一点,其余各种算法,肉眼看来无明显差异。此外,使用CImage进行渲染时缩放,帧率可达105,效果与Point相似。

个人建议,如果对图像的缩放,要追求高效,比如说是视频图像的处理,在不明确是放大还是缩小时,直接使用SWS_FAST_BILINEAR算法即可。如果明确是要缩小并显示,建议使用Point算法,如果是明确要放大并显示,其实使用CImage的Strech更高效。

当然,如果不计速度追求画面质量。在上面的算法中,选择帧率最低的那个即可,画面效果一般是最好的。

不过总的来说,ffmpeg的scale算法,速度还是非常快的,毕竟我选择的素材可是高清的图片。

(本想顺便上传一下图片,但各组图片差异其实非常小,恐怕上传的时候格式转换所造成的图像细节丢失,已经超过了各图片本身的细节差异,因此此处不上传图片了。)

注:试验了一下OpenCV的Resize效率,和上面相同的情况下,OpenCV在上面的放大试验中,每秒可以进行52次,缩小试验中,每秒可以进行458次。

原文地址:http://www.cnblogs.com/acloud/archive/2011/10/29/sws_scale.html

更新(2014.8.5)================

FFmpeg使用不同sws_scale()缩放算法的命令示例(bilinear,bicubic,neighbor):

ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bilinear -pix_fmt yuv420p src01_bilinear_1280x720.yuv
ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bicubic -pix_fmt yuv420p src01_bicubic_1280x720.yuv
ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags neighbor -pix_fmt yuv420p src01_neighbor_1280x720.yuv

ffmpeg中的sws_scale算法性能测试相关推荐

  1. FFmpeg 中文文档

    ffmpeg的中文文档 Posted on 13 Feb 2015   ffmpegDocuments   添加评论 ffmpeg的文档,把之前三个文章直接合并而成的.没有新的内容和改动. 1. 概要 ...

  2. ffmpeg中文文档

    原文链接:https://wanglongqi.github.io/tools/2015/02/13/ffmpegcn/ ffmpeg的文档,把之前三个文章直接合并而成的.没有新的内容和改动. 1. ...

  3. ffmpeg中获取mv/mb_type/dct_coeff/qp和MBSize等数据(H.264)

    ffmpeg是一个很复杂的库,在我看来,比JM要复杂很多,刨除其包含各种编解码方案,算法的全面性,以及其各种平台的汇编优化等因素,其运行逻辑结构和函数之间的调用关系等都要复杂很多.今天我们不泛泛而谈, ...

  4. 从ffmpeg中抓取mv/mb_type/dct_coeff/qp和MBSize等数据(H.264)

    ffmpeg是一个很复杂的库,在我看来,比JM要复杂很多,刨除其包含各种编解码方案,算法的全面性,以及其各种平台的汇编优化等因素,其运行逻辑结构和函数之间的调用关系等都要复杂很多.今天我们不泛泛而谈, ...

  5. Android直播开发之旅(18):FFmpeg中滤镜(filter)的工作原理

    文章目录 1. 什么是滤镜 1.1 简单滤镜(滤镜链) 1.2 复杂滤镜(滤镜图) 2. 滤镜API介绍与使用 2.1 滤镜API介绍 2.1.1 结构体 2.1.2 功能函数 2.2 滤镜API的使 ...

  6. 关于ffmpeg中的VBR控制

    很多朋友问起我关于ffmpeg中VBR的问题,主要是该设置哪些参数,该如何设置等问题.以前我也没有研究过ffmpeg的VBR,所以就在网上查找了一下,无功而返,后面就看ffmpeg.c的源代码,初步认 ...

  7. 【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)

    C++ 泛型编程 中的泛型算法和STL(sort,find,find) 1. 引言 1.1 简述泛型编程和STL的重要性 1.2 介绍泛型算法的基本概念 2. STL中的泛型算法 2.1 定义及主要特 ...

  8. 深度学习中的优化算法之BGD

    之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...

  9. FFmpeg中可执行文件ffplay用法汇总

    从https://ffbinaries.com/downloads 下载最新的4.1版本的windows 64位FFplay.目前linux下的只有3.2版本的.FFplay是一个由FFmpeg和SD ...

最新文章

  1. 放弃安卓原生TimePicker,选择wheelView打造更漂亮的时间get,以及动态拉伸输入框布局,这些,这里都有!...
  2. 机器性能这么好,为什么点击右键弹出菜单还这么慢?
  3. 关于synchronize与lock的区别
  4. 疯狂游戏型计算机配置清单,电脑配置清单
  5. 论文浅尝 | 利用开放域触发器知识改进事件检测
  6. flask+uwsgi+supervisor+nginx在局域网服务器上部署实践
  7. 解决手机QQ发送文件给电脑端,电脑端无法接收的问题
  8. 如何将应用从Win7迁移到Win10 ?
  9. 因子分析(FA)算法简述
  10. 绝对差值和 —— 二分
  11. 教师计算机西沃培训心得,希沃电子白板学习心得体会
  12. xpwifi热点设置android,笔记本xp系统wifi热点设置教程(图文)
  13. window.open用法详解
  14. linux如何用命令进入u盘,linux 下如何打开u盘
  15. Java面试集合(四)
  16. ScyllaDB4.1分布式集群搭建与使用
  17. fabio 安装试用实际使用的几个问题
  18. send sendto ,recv recvfrom有什么区别
  19. 手机红米5android7.11,这些是不支持ANDROID 11更新的小米和红米手机
  20. Matplotlib绘图-快速上手可视化工具

热门文章

  1. POJ3618 Exploration【水题+排序】
  2. HDU5688 Problem D【字符串排序+MAP】
  3. Vijos P1596 加法表【迭代】
  4. HDU2032 杨辉三角【入门+趣味程序】
  5. 中英文对照 —— 标点符号(punctuation)
  6. 程序员的底色(IDE color scheme、CLI 命令行界面)
  7. Scala 基础 —— String(StringOps)、tuple、Range
  8. 数据库分类与四大类NoSQL数据库
  9. Python基础——文件拷贝(从手动实现到shutil的使用)
  10. linux 挖矿效率_linux 服务器发现了挖矿病毒