Python图像处理的替代方案

10

我有一些Python代码需要对照片进行简单处理: 裁剪、调整大小和添加水印。我用过PIL,但是重采样/调整大小的结果很差。我用过ImageMagick,但是它的界面和命令就像把猫装在盒子里然后反复把它扔下楼梯敲键盘。

我正在寻找一种不使用PIL或ImageMagick的东西,可以与Python一起使用来进行简单而高质量的图像转换。事实上,它甚至不需要具备Python绑定,只要命令行接口好用即可。

此外,它需要比较平台无关性,我们的生产服务器是Linux,但是我们的一些开发人员在Windows上开发。它不能要求安装大量愚蠢的GUI代码作为库来使用。


1
你需要找一段时间。除了PIL之外,PyMagick是唯一可用的东西。 - Matthew Talbert
3
人们是如何认为PIL可接受的?任何缩放操作(即使是降采样)都会产生伪影和模糊,即使使用ANTIALIAS重采样设置。 我已经尝试了数小时才能让它产生我可以接受的结果,但与像Photoshop或GIMP这样的桌面工具相比,PIL的调整大小功能是很差劲的。 - Gabriel Hurley
1
我在一个文档生成应用程序中使用带有抗锯齿的resize来生成缩略图,它们与Acrobat PDF查看器所做的相当。 - Anurag Uniyal
9个回答

18

我曾使用过PIL,但是重采样/调整大小的结果非常糟糕。

只要您:

  1. 对于缩小操作,仅使用Image.ANTIALIAS滤波器
  2. 对于放大操作,仅使用Image.BICUBIC滤波器
  3. 如果使用调色板图像,则在调整大小之前记得将其转换为“RGB”颜色模式
  4. 不要使用.thumbnail()方法,它很差
  5. 保存JPEG时将quality=级别设置为适当的值(默认值相当低)

你知道吗,经过进一步的测试,使用 Image.ANTIALIAS 算法的情况下,与缩略图相比,使用 resize 的结果确实更好。如果我以后想起来,我会发布一些各种操作的样本结果。 - Gabriel Hurley
1
请参见https://dev59.com/Q3M_5IYBdhLWcg3waieJ,它并不完全像对比测试那样,但很明显thumbnail()的操作有些问题。 - bobince
只是想强调第五点。很容易忽略,也是这个问题最初抱怨的主要原因。 - Paul McMillan

2

我不确定为什么Image.thumbnail受到如此多的批评。在我运行的当前版本中,它只是计算所需大小并在原地调整图像大小。只要您使用正确的重采样滤镜并首先转换为RGB(如bobince所说),缩略图就不应该与调整大小有任何区别。

这是thumbnail方法的实际源代码:

def thumbnail(self, size, resample=NEAREST):
  # preserve aspect ratio
  x, y = self.size
  if x > size[0]: y = max(y * size[0] / x, 1); x = size[0]
  if y > size[1]: x = max(x * size[1] / y, 1); y = size[1]
  size = x, y

  if size == self.size:
      return

  self.draft(None, size)

  self.load()

  try:
      im = self.resize(size, resample)
  except ValueError:
      if resample != ANTIALIAS:
          raise
      im = self.resize(size, NEAREST) # fallback

  self.im = im.im
  self.mode = im.mode
  self.size = size

  self.readonly = 0

1

我使用过PIL,但缩放/调整大小的结果非常糟糕。

PIL中的调整大小存在许多问题,并且长时间没有得到维护。从Pillow 2.7开始,大部分问题都得到了修复,并且性能得到了显著提升。确保您正在使用最新的Pillow


1
PIL可以很好地进行调整大小。确保您的源图像处于RGB模式而不是调色板颜色,并尝试不同的算法选择。

我一直在普通的JPEG图像上使用它。Image.open('myfile.jpg'),然后Image.thumbnail或Image.resize,最后是Image.save...所有这些都使用ANTIALIAS设置进行降采样。默认情况下应该是RGB模式(JPEG是RGB),并且使用最佳的降采样算法,对吗?如果我漏掉了什么,我很想知道我错在哪里... - Gabriel Hurley
没有看到源代码和源图像,很难说发生了什么。许多人使用 PIL 来完成这种工作,并对结果感到满意。你的情况有所不同(你的视力特别好吗?),但我们还没有弄清楚原因。 - Ned Batchelder

1

虽然ImageMagick似乎是事实上的开源图像库,但可能还有DevIL(跨平台,似乎可以执行简单的图像操作)或FreeImage


1

你查过pypi了吗?初步搜索显示那里有一些与图像相关的工具,我还发现了python-gd,不过我不知道它有多有用。

我自己从来没有遇到过PIL方面的问题,但是尝试一些不同的工具也许会很有趣。


1

GIMP 的命令行界面还是相当不错的。


不幸的是,GIMP需要GTK+,这是在无头服务器上安装的相当愚蠢的库。 - Paul McMillan

1

看看这些图像库:

hxxp://pypi.python.org/pypi/collective.croppingimagefield/0.1beta

hxxp://pypi.python.org/pypi/cropresize/0.1.1

hxxp://pypi.python.org/pypi/image_resize/1.0


0

上次我比较过,这个降采样器的输出与 GIMP 的“cubic”选项几乎完全相同:

 import Image

 def stretch(im, size, filter=Image.NEAREST):
     im.load()
     im = im._new(im.im.stretch(size, filter))
     return im

据我所知,它们之间的差异在视觉上是无法区分的——由于四舍五入,一些像素值会+/-1,并且它们往往会在边缘处变得圆润。 它也不慢。

参考:http://www.mail-archive.com/image-sig@python.org/msg00248.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接