2012-05-16 55 views
30

是否有一個簡單的解決方案來修剪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有一些內置的函數嗎? 還是有一些快速解決方案?

+1

我知道代碼是完全有相同的,但它也可以在這裏找到 - https://gist.github.com/mattjmorrison/932345 –

回答

74

我不認爲有任何內置的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

+4

這是我正在尋找。它像一個魔術般運作。 謝謝。 –

+0

@Ideviantik - 酷,我稍微簡化了它。請享用。 – fraxel

+5

請注意,您正在執行的操作非常危險:它可以補償邊框中的噪點,但您無法再處理背景和圖像本身非常相似的圖像 - 例如,如果白色物品位於白色背景上,則爲照片。 –

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

見例如:Trim image edge whitespace with fuzz [Python]

+1

現在,您的答案中的鏈接轉發至1GB文件下載。刪除它可能是一個好主意。 –