使用PIL修剪空白

Eug*_*rny 47 python imagemagick python-imaging-library

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

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

convert test.jpeg -fuzz 7% -trim test_trimmed.jpeg
Run Code Online (Sandbox Code Playgroud)

我找到了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)
Run Code Online (Sandbox Code Playgroud)

但是这个解决方案有缺点:

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

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

fra*_*xel 108

我不认为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()
Run Code Online (Sandbox Code Playgroud)

重压jpeg:

在此输入图像描述 七分裤: 在此输入图像描述

吵闹的jpeg:

在此输入图像描述 七分裤: 在此输入图像描述

  • 这是我正在寻找的.它就像魔术一样.谢谢. (5认同)
  • 请注意,您正在进行的操作非常危险:它确实可以补偿边框中的噪点,但您无法再处理背景和图像本身非常相似的图像 - 例如,如果白色文章位于白色背景上的照片. (5认同)
  • 我发现这不适用于模式为“RGBA”的图像(“ImageChops.difference”返回完全透明的图像)。而是将 `bg = Image.new(im.mode, im.size, im.getpixel((0,0)))` 更改为 `bg = Image.new("RGB", im.size, im.getpixel(( 0,0)))` 和 `diff = ImageChops.difference(im, bg)` 到 `diff = ImageChops.difference(im.convert("RGB"), bg)` 有效。 (5认同)
  • @WichertAkkerman 也许,我找到了解决方案:用 `diff = ImageChops.add(diff, diff)` 替换 `diff = ImageChops.add(diff, diff, 2.0, -100)` (2认同)

小智 6

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

修剪(颜色=无,模糊= 0)从图像中删除实线边框。默认情况下使用左上角像素作为指导,或者您也可以指定要删除的颜色。

  • 除了尝试接受的答案之外,我刚刚尝试使用 Wand 中的 trim() 功能,并且可以得出结论,Wand 产生的修剪结果要差得多,考虑到我的图像清晰且边框完全实心,这是非常令人惊讶的。 (3认同)
  • 您能详细说明一下答案吗?(举例) (2认同)