使用PIL修剪空白

时间:2012-05-16 09:40:40

标签: python imagemagick python-imaging-library

是否有一个简单的解决方案来修剪PIL中的图像空白?

ImageMagick可以通过以下方式轻松支持它:

convert test.jpeg -fuzz 7% -trim test_trimmed.jpeg

我找到了PIL的解决方案:

from PIL import Image, ImageChops

def trim(im, border):
    bg = Image.new(im.mode, im.size, border)
    diff = ImageChops.difference(im, bg)
    bbox = diff.getbbox()
    if bbox:
        return im.crop(bbox)

但这种解决方案有缺点:

  1. 我需要定义border颜色,这对我来说不是什么大问题,我的图片有白色背景
  2. 最不利的是,此PIL解决方案不支持ImageMagick的-fuzz密钥。添加一些模糊裁剪。因为我可以有一些jpeg压缩工件和不需要的巨大阴影。
  3. 可能PIL有一些内置的功能吗? 还是有一些快速解决方案?

3 个答案:

答案 0 :(得分:97)

我认为PIL内置的任何东西都不能做到这一点。但我修改了你的代码,所以它会这样做。

  • 使用getpixel从左上角的像素获取边框颜色,因此您无需传递颜色。
  • 从差异图像中减去标量,这是将100, 100, 100(在我的示例中)下的所有值饱和为零的快速方法。因此,一种巧妙的方法可以消除因压缩而产生的任何“摆动”。

代码:

from PIL import Image, ImageChops

def trim(im):
    bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
    diff = ImageChops.difference(im, bg)
    diff = ImageChops.add(diff, diff, 2.0, -100)
    bbox = diff.getbbox()
    if bbox:
        return im.crop(bbox)

im = Image.open("bord3.jpg")
im = trim(im)
im.show()

重度压缩的jpeg:

enter image description here裁剪:enter image description here

吵闹的jpeg:

enter image description here裁剪:enter image description here

答案 1 :(得分:2)

使用wand http://docs.wand-py.org/en/0.3-maintenance/wand/image.html

trim(color = None,fuzz = 0)   从图像中删除实线边框。默认情况下使用左上角像素作为参考,或者您也可以指定要删除的颜色。

答案 2 :(得分:2)

在ufp.image模块上使用trim函数。

import ufp.image
import PIL
im = PIL.Image.open('test.jpg', 'r')
trimed = ufp.image.trim(im, fuzz=13.3)
trimed.save('trimed.jpg')