一、Kakadu库分享

       首先分享KakaduV2.2.3源码,大家可以自行下载:链接:https://pan.baidu.com/s/1TMLl_2E-lmSvmKBrQT2nLw 提取码:sfie。

        这里顺便分享《JPEG2000图像压缩基础、标准和实践》一书的电子版,可以自行免费下载。链接:https://pan.baidu.com/s/1GnG6N7rAGrJ_a8P6OCi7pw  提取码:as7b

二、Kakadu库的编译与运行

2.1 Kakadu库的编译

        下载完Kakadu库源码之后,文件目录如下:

        Documentation:主要是Kakadu的基本介绍和以往版本概述。

        Executables:里面是不同系统环境下已编译好的可执行文件。KduCompress.pdf文件主要介绍了Kakadu压缩时所填写的指令参数;KduExpand.pdf主要介绍了解压时所填写的指令参数;KduTranscode.pdf主要是文件格式的转换指令参数。Usage_Examples.txt是kdu_compress、kdu_expand和kdu_show的终端指令举例。

        Kakadu_V2.2.3:该目录下主要就是Kakadu的源码文件。apps是一些应用层代码,coreys是核心层的代码,bin存放的是用户对文件编译后的可执行文件(没编译时是空的),lib存放的是coreys代码编译后的静态库(没编译时是空的)。

        首先我们看一下Documentation\Compiling_Instructions.txt文件,里面介绍了Kakadu库的文件目录结构,BUILD ENVIRONMENTS下面介绍的分别是两种环境下的编译。这里我是选择在ubuntu20.04下进行编译:

        1.首先要对coreys核心库进行编译,才能对apps的应用层库编译。终端进入Kakadu_V2.2.3\Kakadu_V2.2.3\coresys\make,里面有一个Makefile.在终端直接make时会报错:

        主要就是gcc_dwt_mmx.s报了错:invalid instruction suffix for push,这种情况在64位系统和32位系统的as命令对于某些汇编指令的处理支持不一样造成的,因此在gcc_dwt_mmx.s代码头部添加.code32即可。修改完之后gcc_colour_mmx.s也报同理的错误,也在代码头部加入.code32即可。然后再make就可以编译coresys。

        2.核心库编译完成后进入Kakadu_V2.2.3/Kakadu_V2.2.3/apps/make,编译应用层库。在终端直接make即可,虽然报很多警告,但这些都是正常的。编译完成后就可以看到Kakadu_V2.2.3/Kakadu_V2.2.3/bin多了几个可执行文件,这些文件就可以直接运行进行图像压缩和解压之类的操作。

        其实对应用层的编译我们可以看Kakadu_V2.2.3/Kakadu_V2.2.3/apps/make/Makefile是如何写的,当我们想参考官方代码自己去移植修改时,就可以编译自己的应用层程序。单独看kdu_compress的压缩,他的终端编译指令其实是:

g++ -I../../coresys/common -I../args -I../image -I../compressed_io -O -Wall -Wno-uninitialized  ../kdu_compress/kdu_compress.cpp args.o image_in.o palette.o jp2.o roi_sources.o ../../lib/libkdu.a -o ../../bin/kdu_compress -lm

        当然这是在Kakadu_V2.2.3/Kakadu_V2.2.3/apps/make下的编译指令,当自己路径不在这里的时候要注意修改库的相对路径。

2.2 Kakadu库的运行

        命令行的操作指令主要参考Kakadu_V2.2.3/Executables/Usage_Examples.txt

        压缩:

kdu_compress -i image.pgm -o out.j2c -rate 1.0

        这代表以压缩比特率1.0对图像进行压缩,如果没有-rate参数,则对图像进行无损压缩。

        感兴趣压缩: 

kdu_compress -i image.ppm -o out.jp2 -rate 0.5 Creversible=yes Rshift=12 Rlevels=5 -roi "{0.3,0.1},{0.5,0.5}"

        Rshift表示位平面提升因子,Rlevels表示小波变换的级别,Creversible表示变换是否可逆,-roi表示感兴趣区域。值得注意的是,"{0.3,0.1},{0.5,0.5}"必须要有双引号,否则它无法识别;并且这四个参数分别代表top,left,height,weight,输入范围大于0小于1。这是什么意思呢?top代表该区域顶边距离图像顶边高度的占比,left表示ROI区域左边距离图像左边的占比,而height和weight就分别表示高度和宽度占图像高度和宽度的占比。举个简单的例子,比如一幅图像是512×512,而我的roi区域是(216,216)和(296,296)围起来的矩形,如图:

        那top=216/512=0.42,left=216/512=0.42,height=80/512=0.156,weight=80/512=0.156。(还有我自己的疑问是当一个图像有多个ROI区域或者ROI区域不规则时该如何运行,有懂哥的话请帮忙解答一下谢谢!)

        解压的话就比较方便了,一般我对解压没什么要求,要求都在压缩时设置好了,所以解压就直接:

kdu_expand -i out.j2c -o recimage.pgm

        其他具体的设置就参考官方的Kakadu_V2.2.3/Executables/Usage_Examples.txt,还有Executables下的pdf文档。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐