JPEG图片解压缩库PyTurboJPEG

JPEG图片解压缩库PyTurboJPEG

最近在做布料瑕疵检测项目,涉及到存图性能优化的问题,希望在保证图片清晰度的情况下,存图时间尽快可能快,存图文件尽可能小。

PyTurboJPEG库介绍

看到了PyTurboJPEG库,A Python wrapper of libjpeg-turbo for decoding and encoding JPEG image.

libjpeg-turbo是libjpeg的进化版本,libjpeg是经典的JPEG图像编解码开源库。

libjpeg-turbo图像编解码器,使用了SIMD指令(MMX,SSE2,NEON,AltiVec)来加速x86,x86-64,ARM和PowerPC系统上的JPEG压缩和解压缩。在这样的系统上,libjpeg-turbo的速度通常是libjpeg的2-6倍,其他条件相同。在其他类型的系统上,凭借其高度优化的霍夫曼编码,libjpeg-turbo仍然可以大大超过libjpeg。在许多情况下,libjpeg-turbo的性能可与专有的高速JPEG编解码器相媲美。

PyTurboJPEG安装及使用

PyTurboJPEG库安装之前,要先在系统上编译libjpeg-turbo,下面有在win10系统上编译libjpeg-turbo的详细过程。

1、PyTurboJPEG安装

github网址:https://github.com/lilohuang/PyTurboJPEG

• pip install -U git+[https://github.com/lilohuang/PyTurboJPEG.git](https://github.com/lilohuang/PyTurboJPEG.git)

2、示例

import cv2
from turbojpeg import TurboJPEG, TJPF_GRAY, TJSAMP_GRAY, TJFLAG_PROGRESSIVE, TJFLAG_FASTUPSAMPLE, TJFLAG_FASTDCT

# specifying library path explicitly
# jpeg = TurboJPEG(r'D:\turbojpeg.dll')
# jpeg = TurboJPEG('/usr/lib64/libturbojpeg.so')
# jpeg = TurboJPEG('/usr/local/lib/libturbojpeg.dylib')

# using default library installation
jpeg = TurboJPEG()

# decoding input.jpg to BGR array
with open('input.jpg', 'rb') as in_file:
    bgr_array = jpeg.decode(in_file.read())
cv2.imshow('bgr_array', bgr_array)
cv2.waitKey(0)

# decoding input.jpg to BGR array with fast upsample and fast DCT. (i.e. fastest speed but lower accuracy)
with open('input.jpg', 'rb') as in_file:
    bgr_array = jpeg.decode(in_file.read(), flags=TJFLAG_FASTUPSAMPLE|TJFLAG_FASTDCT)
cv2.imshow('bgr_array', bgr_array)
cv2.waitKey(0)

# direct rescaling 1/2 while decoding input.jpg to BGR array
with open('input.jpg', 'rb') as in_file:
    bgr_array_half = jpeg.decode(in_file.read(), scaling_factor=(1, 2))
cv2.imshow('bgr_array_half', bgr_array_half)
cv2.waitKey(0)

# getting possible scaling factors for direct rescaling
scaling_factors = jpeg.scaling_factors

# decoding JPEG image properties
with open('input.jpg', 'rb') as in_file:
    width, height, jpeg_subsample, jpeg_colorspace = jpeg.decode_header(in_file.read())

# decoding input.jpg to YUV array
with open('input.jpg', 'rb') as in_file:
    buffer_array, plane_sizes = jpeg.decode_to_yuv(in_file.read())

# decoding input.jpg to YUV planes
with open('input.jpg', 'rb') as in_file:
    planes = jpeg.decode_to_yuv_planes(in_file.read())

# encoding BGR array to output.jpg with default settings.
with open('output.jpg', 'wb') as out_file:
    out_file.write(jpeg.encode(bgr_array))

# encoding BGR array to output.jpg with TJSAMP_GRAY subsample.
with open('output.jpg', 'wb') as out_file:
    out_file.write(jpeg.encode(bgr_array, jpeg_subsample=TJSAMP_GRAY))

# encoding BGR array to output.jpg with quality level 50. 
with open('output_quality_50.jpg', 'wb') as out_file:
    out_file.write(jpeg.encode(bgr_array, quality=50))

# encoding BGR array to output.jpg with quality level 100 and progressive entropy coding.
with open('output_quality_100_progressive.jpg', 'wb') as out_file:
    out_file.write(jpeg.encode(bgr_array, quality=100, flags=TJFLAG_PROGRESSIVE))

# decoding input.jpg to grayscale array
with open('input.jpg', 'rb') as in_file :
    gray_array = jpeg.decode(in_file.read(), pixel_format=TJPF_GRAY)
cv2.imshow('gray_array', gray_array)
cv2.waitKey(0)

# scale with quality but leaves out the color conversion step
in_file = open('input.jpg', 'rb')
out_file = open('scaled_output.jpg', 'wb')
out_file.write(jpeg.scale_with_quality(in_file.read(), scaling_factor=(1, 4), quality=70))
out_file.close()
in_file.close()

# lossless crop image
out_file = open('lossless_cropped_output.jpg', 'wb')
out_file.write(jpeg.crop(open('input.jpg', 'rb').read(), 8, 8, 320, 240))
out_file.close()

3、与opencv性能对比

TurboJPEG比opencv保存的图片文件大,存图速度大概是opencv的1/3.

配置及软件环境:

  • Windows 7 Ultimate 64-bit
  • Intel® Xeon® E3-1276 v3 CPU @ 3.60 GHz
  • opencv-python 3.4.0.12 (pre-built)
  • turbo-jpeg 1.5.3 (pre-built)
FunctionWall-clock time
cv2.imdecode()0.358 sec
TurboJPEG.decode()0.135 sec
cv2.imencode()0.581 sec
TurboJPEG.encode()0.140 sec

*上面的对比数据来自于github网站

Windows平台编译libjpeg-turbo

windows的库是.lib或者.dll,这样可以在visual studio中去使用。编译.lib文件需要安装以下软件:
Cmake: https://cmake.org
NASM: https://www.nasm.us
Visual Studio

1、下载安装文件,我下载的是zip文件

Git地址:https://github.com/libjpeg-turbo/libjpeg-turbo
库下载地址:https://sourceforge.net/projects/libjpeg-turbo/files/

请添加图片描述

2、zip文件解压,在解压后的文件夹中创建build文件夹。

请添加图片描述

3、打开Cmake软件进行配置,source cdoe和中间件binary分别选择源码目录和build就行。

4、点击configure进行配置,选择你电脑上安装的VS版本,将会创建一个VS的项目。

请添加图片描述

5、点击Finish后,再点击configure,如下:

请添加图片描述
6、cmake_install_prefix是lib库生成的位置,可以自行选择。最后点击Generate,提示Generating done后打开build目录。build目录如下:
请添加图片描述

7、找到build目录下的libjpeg-turbo.sln文件,右键选择用VS打开。

请添加图片描述
8、在VS中,解决方案资源管理器中可以看到ALL_BUILD和INSTALL。首先选择ALL_BUILD->生成(菜单栏)->生成解决方案,完成后选择INSTALL右键->生成(菜单栏)->生成解决方案。
请添加图片描述
9、最后在步骤6中cmake_install_prefix设置的目录中找到生成的turbojpeg.lib文件。如下图:
请添加图片描述

Cmake安装教程

1、下载

CMake官网下载地址:https://cmake.org/download/

里面好多版本,根据自己需要版本进行下载。

【注意】选择好自己电脑是什么系统,以及是32位还是64位。(P.S.x86指的是32位系统;x64指的是64位系统)

2、下载完成后,开始安装。

若下载的是msi安装程序,直接双击图标进行安装。

若下载的是zip文件,先解压zip文件。在解压后的文件中找到bin->cmake.exe,双击开始安装。

安装路径根据自己需要自行修改。【建议】路径名是在英文路径下,不要包含中文和空格

3、 因为在安装过程中选择了自动添加环境,所以安装完后不用手动添加环境了,但是此时必须得重启电脑,变量才能使用,否则无法对Cmake安装进行测试。

重启电脑后,打开cmd黑窗,输入cmake,能够显示cmake的一些信息即为安装成功。

NASM安装教程

1、从https://www.nasm.us/下载nasm

https://www.notion.so

2、若下载的.exe,直接双击安装;若下载的.zip文件,先解压文件,找到解压后的文件中的nasm.exe,双击安装。我使用zip文件安装,安装过程没有弹出安装窗口

3、将nasm.exe所在文件夹路径添加到系统环境变量中

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值