61

是否有一个简单的解决方案来修剪 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 压缩伪影和不需要的巨大阴影。

也许 PIL 有一些内置功能?还是有一些快速的解决方案?

4

3 回答 3

139

我不认为 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:

在此处输入图像描述 裁剪: 在此处输入图像描述

嘈杂的jpeg:

在此处输入图像描述 裁剪:在此处输入图像描述

于 2012-05-16T10:32:13.300 回答
4

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

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

于 2013-12-13T01:26:57.300 回答
2

在 ufp.image 模块中使用修剪功能。

import ufp.image
import PIL
im = PIL.Image.open('test.jpg', 'r')
trimed = ufp.image.trim(im, fuzz=13.3)
trimed.save('trimed.jpg')
于 2015-03-22T07:38:48.613 回答