web-dev-qa-db-ja.com

PILを使用して空白を切り取る

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にはいくつかの組み込み関数がありますか?または、いくつかの高速なソリューションがありますか?

45
Eugene Nagorny

これを行うことができる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

104
fraxel

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')
2
c2o93y50

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

trim(color = None、fuzz = 0)画像から実線の境界線を削除します。デフォルトでは左上のピクセルをガイドとして使用しますが、削除する色を指定することもできます。

2
Jie Bao