2012-05-16 12 views
30

का उपयोग कर ट्रिम व्हाइटस्पेस क्या पीआईएल में छवि पर व्हाइटसाइट को ट्रिम करने का कोई आसान समाधान है?पीआईएल

ImageMagick निम्नलिखित तरीके से इसके लिए आसान समर्थन हासिल है:

convert test.jpeg -fuzz 7% -trim test_trimmed.jpeg 

मैं जनहित याचिका के लिए एक समाधान पाया:

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. और सबसे अधिक नुकसान, यह पीआईएल समाधान ImageMagick की -fuzz कुंजी का समर्थन नहीं करता है। कुछ अस्पष्ट फसल जोड़ने के लिए। क्योंकि मेरे पास कुछ जेपीईजी संपीड़न कलाकृतियों और अनियंत्रित विशाल छायाएं हो सकती हैं।

क्या पीआईएल के कुछ कार्यों में इसका निर्माण हो सकता है? या कुछ तेज समाधान है?

+1

मैं जानता हूँ कि कोड ठीक उसी होती है, लेकिन यह भी पाया जा सकता है - https://gist.github.com/mattjmorrison/932345 –

उत्तर

74

मुझे नहीं लगता कि पीआईएल में कुछ भी बनाया गया है जो ऐसा कर सकता है। लेकिन मैंने आपका कोड संशोधित कर दिया है, इसलिए यह ऐसा करेगा।

  • getpixel का उपयोग करके यह शीर्ष बाएं पिक्सेल से सीमा रंग प्राप्त करता है, इसलिए आपको रंग पारित करने की आवश्यकता नहीं है।
  • अलग छवि से स्केलर घटाता है, यह 100, 100, 100 (मेरे उदाहरण में) शून्य से सभी मानों को संतृप्त करने का एक त्वरित तरीका है। तो संपीड़न के परिणामस्वरूप किसी भी 'wobble' को हटाने के लिए एक साफ तरीका है।

कोड:

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

ध्यान दें कि आपरेशन आप कर रहे हैं बहुत ही खतरनाक है: यह सीमा में शोर के लिए क्षतिपूर्ति करता है, लेकिन तुम अब छवियों जहां पृष्ठभूमि और छवि को ही बहुत समान हैं संभाल कर सकते हैं - अगर सफेद लेख एक सफेद पृष्ठभूमि पर तैनात उदाहरण तस्वीरों के लिए। –

2

उपयोग की छड़ी http://docs.wand-py.org/en/0.3-maintenance/wand/image.html

ट्रिम (रंग = कोई नहीं, फ़ज़्ज़ = 0) छवि से ठोस सीमा निकालें। डिफ़ॉल्ट रूप से एक गाइड के रूप में शीर्ष बाएं पिक्सेल का उपयोग करता है, या आप हटाने के लिए रंग भी निर्दिष्ट कर सकते हैं।

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 फ़ाइल डाउनलोड करने के लिए अब आगे अपने जवाब में जोड़ देते हैं। इसे हटाने के लिए एक अच्छा विचार हो सकता है। –