当前位置: 首页 > ds >正文

Ubuntu下使用PyTurboJPEG加速图像编解码

目录

一、概述

二、安装PyTurboJPEG

三、测试


一、概述

在计算机视觉领域,图像编解码是绕不开的基础环节。虽然 OpenCV 能解决大部分图像处理问题,但在性能要求严苛的场景下存在短板。本文将介绍基于 libjpeg-turbo 的高效 JPEG 编解码库 PyTurboJPEG,特别适用于纯 CPU 环境下的性能优化需求。

PyTurboJPEG 核心优势如下:

  1. 技术渊源:ibjpeg 是经典的 JPEG 压缩库,使用C语言开发,而 libjpeg-turbo 是在此基础上进行深度优化的库,使用来SIMD 指令集(MMX、SSE2、NEON 等)实现性能加速,支持 x86、ARM 等主流架构。本文介绍的PyTurboJPEG则是 libjpeg-turbo 的 Python 封装版。

  2. 性能表现:实测表明,libjpeg-turbo在JPEG 编解码速度上较原生libjpeg提升2-6 倍,且在压缩率与速度之间达到极佳平衡,性能可媲美部分商业编解码器。

二、安装PyTurboJPEG

本文实验环境为Ubuntu22.04。

首先安装nasm:

sudo apt-get install nasm

然后进入下载官网页面,网址https://sourceforge.net/projects/libjpeg-turbo/files/ 。

下载2.0.x版本对应的libjpeg-turbo-2.0.2.tar.gz,如下图所示:

下载后使用下面的命令进行解压

tar -zxvf libjpeg-turbo-2.0.2.tar.gz

然后使用下面的命令进行编译和安装:

cd libjpeg-turbo-2.0.2
mkdir build 
cd build
cmake -G"Unix Makefiles" ..
make -j8
sudo make install
sudo cp -rvf /opt/libjpeg-turbo/lib64/* /lib/

最后安装PyTurboJPEG库即可:

pip install PyTurboJPEG

三、测试

下面测试图像读取的性能。

以下是使用Opencv的imdecode函数实现:

import os
import time
import cv2
import numpy as npfrom turbojpeg import TurboJPEGimg_folder = '../test/img5/'
dst_folder = '../test/result/'# 检索img_folder下的所有图片
img_files = os.listdir(img_folder)
jpegtool = TurboJPEG()start_time = time.time()# 逐张处理
pic = 0
for img_file in img_files:# 使用opencv的decode读取图像img = cv2.imdecode(np.fromfile(img_folder + img_file, dtype=np.uint8), cv2.IMREAD_COLOR)pic += 1end_time = time.time()
print('average time: ', (end_time - start_time) / pic)

测试结果为2.5ms/张图像。

下面是使用PyTurboJPEG的版本:

import os
import timefrom turbojpeg import TurboJPEGimg_folder = '../test/img5/'
dst_folder = '../test/result/'# 检索img_folder下的所有图片
img_files = os.listdir(img_folder)
jpegtool = TurboJPEG()start_time = time.time()# 逐张处理
pic = 0
for img_file in img_files:# decoding input.jpg to BGR arraywith open(img_folder + img_file, 'rb') as in_file:bgr_array = jpegtool.decode(in_file.read())pic += 1end_time = time.time()
print('average time: ', (end_time - start_time) / pic)

测试结果为2.0ms/张。

http://www.xdnf.cn/news/14004.html

相关文章:

  • 【阿里巴巴 x 浙江大学】信息与交互设计 - 交互设计流程与要素
  • PDB Bank怎么下载小分子sdf(选择哪个)和复合物
  • Spring依赖注入的四种方式(面)
  • DC3靶机渗透
  • python计算生态库:18个常用标准库+第三方库
  • 杭州电商代运营公司排名前十
  • SPRING AI 入门
  • 前端八股文 - JavaScript 篇
  • UE接口通信常见问题
  • Ubuntu下搭建Black Magic Probe (BMP) 编译环境
  • AbMole| 2-Deoxy-D-glucose(M5140;2-脱氧-D-葡萄糖)
  • 第七章接入技术
  • opencv opencv_contrib vs2020 源码安装
  • 简述Python里面search和match的区别
  • ZooKeeper详解以及应用部署(AI)
  • Spring Cache 详细介绍——补充
  • 深度解析 JuiceFS 权限管理:Linux 多种安全机制全兼容
  • JavaScript 原型(Prototype)详解
  • 金属切削机床制造企业如何破局?探索项目管理数字化转型
  • 学习STC51单片机35(芯片为STC89C52RCRC)智能小车3(PWM调速小车)
  • C++学习之虚析构函数
  • 【QT】QVariant 转换为自定义的枚举类型
  • 当机械工程师的餐桌变身实验室:立创电赛的真实创新启示录
  • 《深度优先搜索》题集
  • 结构型模式 (7种)
  • 鸿蒙期末总结
  • 高铁列车能否考虑加装飞翼?
  • 深入剖析 C++ 默认函数:拷贝构造与赋值运算符重载
  • C# TAP异步编程(Task/async/await)总结
  • VRFF: Video Registration and Fusion Framework