使用 QccPack 和 Python 进行图像处理
有限的带宽和存储空间始终是一个挑战。数据压缩通常是最佳解决方案。在图像处理领域,压缩技术分为两种类型:无损数据压缩和有损数据压缩。
QccPack 由 James Fowler 开发,是一个开源库例程和实用程序集合,用于量化和可靠地实现常见的压缩技术。
为 QccPack 编写的库具有清晰的接口。到目前为止,这些库可以升级,而无需修改应用程序代码。QccPack 由一个静态链接库 libQccPack.a 组成,并支持与 libQccPack.so 的动态链接。
熵编码、小波变换、基于小波的子带编码、纠错编码、图像处理和通用例程的实现可以通过 QccPack 提供的库例程来完成。QccPack 库的可选模块可供以后添加。QccPackSPIHT 是 QccPack 库的一个可选模块,它提供了用于图像压缩的分层树集合分割 (SPIHT) 算法的实现。QccPackSPIHT 模块包括两个实用程序可执行文件,spihtencode 和 spihtdecode,用于对灰度图像执行 SPIHT 编码和解码。
QccPack 和 QccPackSPIHT 可从 SourceForge 上的 QccPack 网页下载。Red Hat 用户可以在该网站找到源代码和二进制 RPM。其他系统的用户需要编译源代码。QccPack 已在 Solaris/SPARC、Irix、HP-UX、Digital UNIX Alpha 和 Digital RISC/Ultrix 上成功编译。
您可以使用 QccPack 在图像上训练 VQ 码本,然后使用全搜索 VQ 和算术编码对图像进行编码。以 512*512 灰度 Lenna 图像为例。以下示例过程假设您在 Python 解释器提示符下。
步骤 1:通过提取像素的四维 (2x2) 向量,将 PGM 图像文件格式转换为 DAT 格式文件
>>> imgtodat-ts 4 lenna.pgm.gz lenna.4D.dat.gz
步骤 2:在 DAT 文件上使用 GLA 训练 256 码字的 VQ 码本(停止阈值 = 0.01)
>>> gla -s 256 -t 0.01 lenna.4D.dat.gz lenna.4D256.cbk
步骤 3:向量量化 DAT 文件以生成 VQ 索引通道
>>> vqencode lenna.4D.dat.gz lenna.4D256.cbk lenna.vq.4D256.chn
步骤 4:计算 VQ 索引的一阶熵(以比特/像素为单位)
>>> chnentropy -d 4 lenna.vq.4D256.chn First-order entropy ↪of channel lenna.vq.4D256.chn is: 1.852505 (bits/symbol)
步骤 5:对 VQ 索引通道进行算术编码
>>> chnarithmeticencode -d 4 lenna.vq.4D256.chn ↪lenna.vq.4D256.chn.ac
通道 lenna.vq.4D256.chn 算术编码为:1.830322(比特/符号)
>>> rm lenna.vq.4D256.chn
步骤 6:解码算术编码通道
>>> chnarithmeticdecode lenna.vq.4D256.chn.ac lenna.vq.4D256.chn
步骤 7:逆 VQ 通道以生成量化数据
>>> vqdecode lenna.vq.4D256.chn lenna.4D256.cbk ↪lenna.vq.4D256.dat.gz
步骤 8:从 DAT 转换为 PGM 格式
>>> dattoimg 512 512 lenna.vq.4D256.dat.gz lenna.vq.4D256.pgm
步骤 9:计算原始图像和编码图像之间的失真
>>> imgdist lenna.pgm.gz lenna.vq.4D2 56.pgm
文件 lenna.pgm.gz 和 lenna.vq.4D256.pgm 之间的失真为
13.841091 (MSE)
22.186606 dB (SNR)
36.719100 dB (PSNR)
Python 图像处理库为 Python 解释器添加了图像处理功能。该库提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。核心图像库专为快速访问存储在几种基本像素格式中的数据而设计。该库包含一些基本的图像处理功能,包括点运算、使用一组内置卷积核的滤波和颜色空间转换。Python 图像处理库非常适合图像存档和批量处理应用程序。您可以使用该库创建缩略图、在文件格式之间转换和打印图像。该库还支持图像大小调整、旋转和任意仿射变换。
Python 图像处理库使用插件模型,允许您向库中添加自己的解码器,而无需对库本身进行任何更改。这些插件的名称类似于 XxxImagePlugin.py,其中 Xxx 是唯一的格式名称(通常是缩写)。
Python、xv 和 PIL 软件包是 Python 图像处理编程必不可少的。运行以下命令在 Linux 中构建 PIL
python setup.py build_ext -i python selftest.py
Python 图像处理库中最重要的类是 Image 类,它在同名模块中定义。我们通过几种方式创建此类的实例:从文件加载图像、处理其他图像或从头开始创建图像。
要从文件加载图像,请使用 Image 模块中的 open 函数
>>> import Image >>> im = Image. open ("lenna.ppm")
Python 图像处理库支持各种图像文件格式。该库根据文件内容或扩展名自动确定格式。
列表 1. 将文件转换为 JPEG
import os, sys import Image for infile in sys.argv[1:]: outfile = os.path.splitext(infile)[0] + ".jpg" if infile != outfile: try: Image.open(infile).save(outfile) except IOError: print "cannot convert", infile
下一个示例(列表 2)展示了 Image 类如何包含调整图像大小和旋转图像的方法。
Python 图像处理库允许您使用 convert 函数在不同的像素表示之间转换图像——例如,在模式之间转换
im = Image.open("lenna.ppm").convert ("L")
该库支持在每个支持的模式与 L 和 RGB 模式之间进行转换。要在其他模式之间进行转换,您可能需要使用中间图像。
ImageFilter 模块包含许多预定义的增强过滤器,可以与 filter 方法一起使用。例如,从 Python 提示符下,执行以下操作
>>> import ImageFilter >>> out = im.filter(ImageFilter.DETAIL)
导入模块后,您可以使用以下任何过滤器
ImageFilter.BLUR
ImageFilter.CONTOUR
ImageFilter.DETAIL
ImageFilter.EDGE_ENHANCE
ImageFilter.EDGE_ENHANCE_MORE
ImageFilter.EMBOSS
ImageFilter.FIND_EDGES
ImageFilter.SMOOTH
ImageFilter.SMOOTH_MORE
ImageFilter.SHARPEN
某些解码器允许您在从文件读取图像时操作图像。这通常可以用于在创建缩略图和打印到单色激光打印机时加快解码速度。draft 方法操作已打开但尚未加载的图像,使其尽可能接近给定的模式和大小。重新配置图像解码器即可完成此操作。请参阅列表 3,了解如何在草稿模式下读取图像的示例。
列表 3. 在草稿模式下读取
im = Image.open (file) print "original =", im.mode, im.size im.draft("L", (100, 100)) print "draft =", im.mode, im.size This prints something like: original = RGB (512, 512) draft = L (128, 128)
列表 4 显示了 ImageDraw 模块如何为 Image 对象提供基本的图形支持。
列表 4. 在图像上绘制灰色十字
import Image, ImageDraw im = Image.open("lenna.pgm") draw = ImageDraw.Draw(im) draw.line((0, 0) + im.size, fill=128) draw.line ((0, im.size[1], im.size[0], 0), fill=128) del draw im.save(sys.stdout, "PNG")
pildriver 工具允许您从操作系统的命令行界面访问大多数 PIL 功能。当作为脚本调用时,命令行参数将传递给 PILDriver 实例。如果没有命令行参数,该模块将运行交互式解释器,其中的每一行都拆分为空格分隔的标记并传递给 execute 方法。pildriver 工具由 Eric S. Raymond 贡献。以下命令来自 Python 提示符
>>> pildriver program >>> pildriver show crop 0 0 200 300 open test.png >>> pildriver save rotated.png rotate 30 open test.tiff
pildriver 模块提供了一个名为 PILDriver 的类。PILDriver 类的实例本质上是用于对 PIL 图像变换进行排序的软件堆栈机(波兰表示法解释器)。实例的状态是解释器堆栈。通常在初始化后调用的唯一方法是 execute 方法。这需要一个标记的参数列表,将它们压入实例的堆栈,然后尝试通过连续评估 PILdriver 运算符来清除堆栈。堆栈的任何未清除部分都会持久存在,并且是下一次 execute 方法调用的评估上下文的一部分。PILDriver 不会捕获任何异常,因为这些异常实际上包含应由调用代码解释的诊断信息。
pilconvert 工具将图像从一种格式转换为另一种格式。输出格式由目标扩展名确定,除非使用 -c 选项显式指定
>>> pilconvert lenna.tif lena.png >>> pilconvert -c JPEG lenna.tif lena.tmp
用于 Python 的 SDC 形态学工具箱是用于图像分析和信号处理的软件。它基于离散非线性滤波器和格运算原理。这些滤波器称为形态学算子。形态学算子对于图像和信号的恢复、分割和定量分析非常有用。SDC 形态学工具箱有效地应用于机器视觉、医学成像、桌面出版、文档处理以及食品工业和农业需求。
灰度图像通常使用 8 位或 16 位来表示每个像素即可正常工作。图像上的基本算子以分层方式使用。有两种类型的基本算子:膨胀和腐蚀。除这些算子之外的其他算子是距离变换、分水岭、重建、标记和面积开运算。SDC 形态学工具箱在各种平台(如 Win95/98/NT、Linux 和 Solaris)上受支持。
此工具箱中使用了一些常用约定。SDC 形态学工具箱的所有运算符均以 mm 开头。这些运算符返回单个数据结构,并且传递的参数与位置和类型相关。SDC 形态学工具箱中的大多数函数都在 3-D 中运行。
特别感谢 James Fowler 对 QccPack 的贡献。还要感谢 RPI 的 W. Pearlman 和 PrimaComp 的 L. Granda 对 QccPackSPIHT 模块的贡献。最后但并非最不重要的,感谢 Python SIG 组对 PIL 的贡献。
Suhas A. Desai 在 Tech Mahindra Ltd. 工作。他撰写关于开源和安全的文章。在空闲时间,他为社会事业做义工。