【问题标题】:Trim whitespace using PIL使用 PIL 修剪空格
【发布时间】:2012-05-23 20:38:23
【问题描述】:

有没有简单的解决方案可以在 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 有一些内置功能? 或者有什么快速的解决方案?

【问题讨论】:

标签: python imagemagick python-imaging-library


【解决方案1】:

在 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')

【讨论】:

  • 您答案中的链接现在转发到 1gb 文件下载。删除它可能是个好主意。
  • @WillS 您可以编辑答案,它将被审查和更新。
  • 我无法 pip install ufp。我收到以下错误消息ERROR: Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/vd/5ccxv4957f1_prjqt1l_ppsw0000gq/T/pip-install-ya7p01_3/ufp/。此外,没有 ufp 的 github 存储库,因此我可以联系开发人员。
  • ufp 不兼容 Python 3。
【解决方案2】:

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

修剪(颜色=无,绒毛=0) 从图像中删除实心边框。默认使用左上角像素作为参考线,您也可以指定要移除的颜色。

【讨论】:

  • 您能详细说明一下答案吗? (举个例子)
  • 我刚刚尝试使用 Wand 中的 trim() 功能,除了尝试接受的答案之外,可以得出结论认为 Wand 产生的修剪结果要差得多,考虑到我的图像很清晰而且边框很清晰,这非常令人惊讶完全坚固。
【解决方案3】:

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

裁剪:

【讨论】:

  • 请注意,您正在执行的操作非常危险:它确实可以补偿边框中的噪点,但您无法再处理背景和图像本身非常相似的图像 - 例如白色的照片文章定位在白色背景上。
  • 这条线在做什么? " diff = ImageChops.add(diff, diff, 2.0, -100)" 您是否只是想避免 getbbox 的边缘为零?
  • @WichertAkkerman 请告诉我如何解决这个问题,如果你知道?在我的目的中,我只需要严格修剪空格(255、255、255、255)
  • @WichertAkkerman 也许,我找到了解决方案:用diff = ImageChops.add(diff, diff)替换diff = ImageChops.add(diff, diff, 2.0, -100)
  • 不是仅从一个像素获取边框颜色,而是获取所有周边像素或至少 4 个角像素的 平均 边框颜色呢?如何实现?
猜你喜欢
  • 2017-12-03
  • 1970-01-01
  • 2014-05-07
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 2019-03-20
  • 2020-04-25
相关资源
最近更新 更多