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.pswp.cn/bicheng/84694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCU、MPU、GPU、Soc、DSP、FPGA、CPLD……它们到底是什么?

MCU、MPU、GPU、Soc、DSP、FPGA、CPLD…… 这些简称在各大论坛、会议、发布会中屡见不鲜,看到简称,虽然也能说出大概; 但要问具体是什么?用在什么场景?又有什么区别……好像还是差点意思;本篇文章就记录一…

Django RBAC项目后端实战 - 03 DRF权限控制实现

项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…

[网页五子棋][用户模块]数据库设计和配置(MyBatis)、约定前后端交互接口、服务器开发

文章目录 数据库数据库设计配置 MyBatis1. Spring 配置2. 创建实体类3. 创建 Mapper 接口4. 使用 MyBatis 约定前后端交互接口登录接口注册接口获取用户信息 服务器开发loginregistergetUserInfo完整代码 数据库 数据库设计 完成注册登录以及用户分数管理 使用数据库来保存上…

Qt/C++学习系列之列表使用记录

Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件,同步使用QTableWidgetItem进行单元格的设置,最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…

防火墙通常可以分为哪些类型?

防火墙是目前保护网络安全的重要设备,能够通过监控、过滤和控制进出网络的数据流量,来保护内部网络不会受到未经授权的IP地址进行访问和恶意的网络威胁,设置防火墙能够帮助企业确保网络的安全性,同时防火墙也会根据不同的功能来划…

基于GeoTools的道路相交多个点容差冗余计算实战

目录 前言 一、关于道路相交 1、相交四个点 2、点更多的情况 二、基于距离的相交点去重 1、冗余距离计算 2、调用过程 3、去重后的结果 三、总结 前言 在地理信息系统(GIS)领域,道路网络数据的处理与分析一直是关键课题。随着城市化进…

android:foregroundServiceType详解

在 Android 中,foregroundServiceType 是用于声明前台服务类型的属性,主要从 Android 10(API 29)开始引入,并在 Android 11(API 30)及更高版本 中进一步细化。以下是所有可用的 foregroundServi…

React+Taro 微信小程序做一个页面,背景图需贴手机屏幕最上边覆盖展示

话不多说 直接上图 第一步 import { getSystemInfoSync } from tarojs/taro;第二步 render() {const cardBanner getImageUrlByGlobal(member-merge-bg.png);const { safeArea, statusBarHeight } getSystemInfoSync();const NAV_BAR_HEIGHT 44;const navBarHeight NAV…

从零开始的云计算生活——番外,实战脚本。

目录 题目一:系统信息收集脚本 题目二:用户管理配置脚本 题目三:磁盘空间管理脚本 题目四:网络配置检查脚本 题目五:系统日志分析脚本 题目一:系统信息收集脚本 编写一个脚本名为 collect_system_info…

MySQL基础知识(DDL、DML)

什么是数据库? 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。 注释: 单行注释:-- 注释内容 或 # 注释内容(MySQL特有)多行注释: /* 注释内容 */ 分类 SQL语句根据其功能被分为…

用volatile修饰数组代表什么意思,Java

文章目录 volatile 修饰数组引用的含义volatile 对数组元素无效总结 如何让数组元素也具有 volatile 特性? 当用 volatile 关键字修饰一个数组时,它只保证数组引用的可见性和部分原子性,而不保证数组元素的可见性和原子性。 换句话说&#x…

Ubuntu 24.04 LTS 长期支持版发布:对服务器用户意味着什么?新特性、升级建议与性能影响初探

更多云服务器知识,尽在hostol.com 在服务器运维的广阔世界里,每一次主流操作系统长期支持(LTS)版本的发布,都无异于一次重要的“时代交替”。它不仅带来了一系列令人瞩目的技术革新,更重要的是&#xff0c…

题目 3241: 蓝桥杯2024年第十五届省赛真题-挖矿

题目 3241: 蓝桥杯2024年第十五届省赛真题-挖矿 时间限制: 3s 内存限制: 512MB 提交: 1267 解决: 224 题目描述 小蓝正在数轴上挖矿,数轴上一共有 n 个矿洞,第 i 个矿洞的坐标为 ai 。小蓝从 0 出发,每次可以向左或向右移动 1 的距离&#xf…

vue3+ts+vite创建的后台管理系统笔记

Vue3+ Vite + Element-Plus + TypeScript 从0到1搭建企业级后台管理系统(前后端开源):参考有来科技学习搭建项目 创建项目bug汇总,知识点src 路径别名配置和tsconfig.json文件报错【这个不配置好,会引起其他页面引用时报错:见--整合 Pinia】:整合 Pinia 【参考-- src 路径…

指针01 day13

十三:指针变量 一:数据类型 ​ 指针类型---------对应处理的数据是指针 (地址)这种数据 ​ 整型类型---------对应处理的数据是整数这种类型 二:定义指针类型的变量 ​ 语法: 基类型(1) *(…

基于深度学习的智能文本生成:从模型到应用

前言 随着人工智能技术的飞速发展,自然语言处理(NLP)领域取得了显著的进展。其中,智能文本生成技术尤其引人注目。从聊天机器人到内容创作,智能文本生成不仅能够提高效率,还能创造出令人惊叹的内容。本文将…

Oracle业务用户的存储过程个数及行数统计

Oracle业务用户的存储过程个数及行数统计 统计所有业务用户存储过程的个数独立定义的存储过程定义在包里的存储过程统计所有业务用户存储过程的总行数独立定义的存储过程定义在包里的存储过程通过DBA_SOURCE统计类型个数和代码行数📖 对存储过程进行统计主要用到以下三个系统…

多线程安全:核心解决方案全解析

在多线程环境下保证共享变量的线程安全,需解决原子性、可见性、有序性三大问题。以下是核心解决方案及适用场景: 一、同步锁机制(互斥访问) synchronized 关键字 原理:通过 JVM 监视器锁(Monitor)确保同一时间仅一个线程访问临界区。示例:public class Counter {privat…

2025-06-01-Hive 技术及应用介绍

Hive 技术及应用介绍 参考资料 Hive 技术原理Hive 架构及应用介绍Hive - 小海哥哥 de - 博客园https://cwiki.apache.org/confluence/display/Hive/Home(官方文档) Apache Hive 是基于 Hadoop 构建的数据仓库工具,它为海量结构化数据提供类 SQL 的查询能力&#xf…

Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集

目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…