相关疑难解决方法(0)

使用PIL修剪空白

是否有一个简单的解决方案来修剪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有一些内置的功能吗?还是有一些快速解决方案?

python imagemagick python-imaging-library

47
推荐指数
2
解决办法
2万
查看次数

python图像库(PIL)中的getbbox方法不起作用

我想通过剪切边框上的白色区域将图像裁剪为较小的尺寸.我尝试了在这个论坛中建议的解决方案将PNG图像裁剪为其最小尺寸但是pil的getbbox()方法返回了与图像大小相同的边界框,即它似乎无法识别空白区域周围.我尝试了以下方法:

>>>import Image
>>>im=Image.open("myfile.png")
>>>print im.format, im.size, im.mode
>>>print im.getbbox()
PNG (2400,1800) RGBA
(0,0,2400,1800)
Run Code Online (Sandbox Code Playgroud)

我通过使用GIMP自动裁剪裁剪图像来检查我的图像是否具有真正的白色可裁剪边框.我也试过ps和eps版本的图,没有运气.
任何帮助将受到高度赞赏.

python crop bounding-box image-editing python-imaging-library

7
推荐指数
1
解决办法
1万
查看次数

无法裁掉透明度,PIL getbbox()和Numpy都无法正常工作

在图像处理方面我非常喜欢:(我有一堆PNG文件(其中300个),我希望裁剪大面积的透明度.我想显然自动化过程,因此为什么我尝试使用python和PIL.

现在我看看以下链接, 将PNG图像裁剪为最小尺寸,并使用此链接建议的Numpy,使用python/PIL自动裁剪图像,两者都没有成功:(输出文件与输入文件!没有裁剪透明度,大小相同.getbbox返回相同的宽度和高度.

这是其中一个图像的链接; 98x50 按钮图像是一个铃铛形状的按钮图标.它是用白色绘制的,因此很难看出哪个透明背景.预期的结果将是一个20x17的按钮(内部透明度为20x17的盒子保持不变)

这是我正在使用的代码;

#!/usr/bin/env python

import sys
import os
import Image
import numpy as np


def autocrop_image2(image):
    image.load()

    image_data = np.asarray(image)
    image_data_bw = image_data.max(axis=2)
    non_empty_columns = np.where(image_data_bw.max(axis=0) > 0)[0]
    non_empty_rows = np.where(image_data_bw.max(axis=1) > 0)[0]
    cropBox = (min(non_empty_rows), max(non_empty_rows),
               min(non_empty_columns), max(non_empty_columns))

    image_data_new = image_data[cropBox[0]:cropBox[
        1] + 1, cropBox[2]:cropBox[3] + 1, :]

    new_image = Image.fromarray(image_data_new)
    return new_image


def autocrop_image(image, border=0):
    # Get the bounding box
    bbox = image.getbbox()

    # Crop the image to the contents …
Run Code Online (Sandbox Code Playgroud)

python numpy image python-imaging-library

1
推荐指数
1
解决办法
1396
查看次数