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)
Function | Wall-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
2、若下载的.exe,直接双击安装;若下载的.zip文件,先解压文件,找到解压后的文件中的nasm.exe,双击安装。我使用zip文件安装,安装过程没有弹出安装窗口
3、将nasm.exe所在文件夹路径添加到系统环境变量中