2013-01-22 56 views
52

मैंने पाइथन छवि लाइब्रेरी (पीआईएल) का उपयोग करके एक छवि का उपयोग करके कुछ छवि प्रसंस्करण किया है जो मैंने पहले छवियों के चारों ओर परिवर्तन करने के लिए पाया था और मुझे काम करने के लिए सहेजने का कार्य नहीं मिल रहा है। पूरे कोड ठीक काम करता है, लेकिन यह सिर्फ अभ्यस्त जिसके परिणामस्वरूप छवि को बचाने:मैं पीआईएल के साथ एक छवि कैसे सहेज सकता हूं?

save_handler = SAVE[string.upper(format)] # unknown format 
    KeyError: '.BMP' 

मैं अजगर जनहित याचिका के साथ एक छवि कैसे बचा सकते हैं: निम्नलिखित

from PIL import Image 
import numpy as np 

i = Image.open("C:/Users/User/Desktop/mesh.bmp") 
i = i.convert("L") 
a = np.asarray(i) 
b = np.abs(np.fft.rfft2(a)) 
j = Image.fromarray(b) 
j.save("C:/Users/User/Desktop/mesh_trans",".bmp") 

त्रुटि मैं मिलता है?

उत्तर

67

फाइल एक्सटेंशन के संबंध में त्रुटि संभाला किया गया है, तो आप या तो bmp का उपयोग (डॉट) के बिना, या पास पहले से एक्सटेंशन के साथ आउटपुट नाम। अब त्रुटि को संभालने के लिए आपको आवृत्ति डोमेन में अपने डेटा को एक पूर्णांक छवि के रूप में सहेजने के लिए उचित रूप से संशोधित करने की आवश्यकता है, PIL आपको बता रहा है कि यह बीएमपी के रूप में सहेजने के लिए फ्लोट डेटा स्वीकार नहीं करता है। मुझे पता है कि यह पुराना है

import sys 
import numpy 
from PIL import Image 

img = Image.open(sys.argv[1]).convert('L') 

im = numpy.array(img) 
fft_mag = numpy.abs(numpy.fft.fftshift(numpy.fft.fft2(im))) 

visual = numpy.log(fft_mag) 
visual = (visual - visual.min())/(visual.max() - visual.min()) 

result = Image.fromarray((visual * 255).astype(numpy.uint8)) 
result.save('out.bmp') 
+1

अरे बहुत बहुत धन्यवाद। यह अभी सही काम करता है! अब मुझे बस इतना करना है कि सभी कदमों को समझें लेकिन यह बहुत बुरा नहीं होगा। सहायता – user1999274

+0

@ user1999274 सहायता के लिए बहुत बहुत धन्यवाद, क्योंकि अंतर भिन्न डेटा के लिए 'rftt'' के बजाय' fft2' के उपयोग में है, बाद में उपयोग करने में बिंदु नहीं दिखता है। शेष पूरी तरह से कॉस्मेटिक है, यानी, आप फोरियर ट्रांसफॉर्म को उचित रूप से विज़ुअलाइज़ करने में सक्षम नहीं होंगे, इसके बिना लॉग कारक लागू किए बिना। फिर सामान्यीकरण श्रेणी [0, 255] के रूपांतरण के लिए चीजों को सरल रखना है। – mmgp

+0

'visual = (visual - visual.min())/(visual.max() - visual.min()) 'विज़ुअल' में कोई भिन्नता नहीं है (संभावना नहीं है, लेकिन पकड़ने लायक है) –

5

.bmp से पहले . को हटाने का प्रयास करें (यह BMP से अपेक्षाकृत मेल नहीं खाता है)। जैसा कि आप त्रुटि से देख सकते हैं, save_handler आपके द्वारा प्रदत्त format ऊपरी-आवरण है और फिर SAVE में एक मिलान की तलाश में है। हालांकि उस ऑब्जेक्ट में संबंधित कुंजी BMP है (.BMP के बजाय)।

मुझे PIL के बारे में बहुत कुछ पता नहीं है, लेकिन इसके आसपास कुछ त्वरित खोज से यह लगता है कि यह छवि के mode के साथ एक समस्या है। करने के लिए j की परिभाषा बदलने:

j = Image.fromarray(b, mode='RGB') 

मेरे लिए काम करने के लिए (हालांकि ध्यान दें मैं PIL की बहुत कम जानकारी है कि, तो मैं जैसे @ mmgp के समाधान का उपयोग कर सुझाव है कि लग रहा था/वह स्पष्ट रूप से जानता है कि वे क्या कर रहे हैं:))। mode के प्रकारों के लिए, मैंने this पृष्ठ का उपयोग किया - उम्मीद है कि आपके लिए कोई विकल्प आपके लिए काम करेगा।

+0

मैंने बीएमपी के पक्ष में .bmp को हटाने का प्रयास किया और यह अभी भी काम नहीं करता है। अब मुझे जो त्रुटि मिलती है वह है: IOError: मोड एफ को बीएमपी के रूप में नहीं लिख सकता है। मैंने दस्तावेज के लिए पीआईएल पृष्ठों की जांच की और कहा कि .bmp का उपयोग करने के लिए कहा गया है, लेकिन मुझे अभी भी पता नहीं है कि यह क्यों काम नहीं कर रहा है। – user1999274

+0

@ user1999274 एक अद्यतन पोस्ट किया गया जो मेरे लिए काम करना प्रतीत होता है (विस्तार की कमी के लिए क्षमा चाहता है - जैसा कि मैं साथ जाता हूं) इसे एक साथ जोड़ रहा हूं :)। – RocketDonkey

+0

@RocketDonkey यह उससे थोड़ा अधिक स्मार्ट हो गया है, क्योंकि एक फूरियर ट्रांसफॉर्म के परिणाम को आरजीबी रंगस्थान में बदलना एक अर्थहीन छवि देगा। सिर्फ इसलिए कि यह अब अपवाद नहीं उठाता है, इसका मतलब यह नहीं है कि परिणाम सही है। – mmgp

18

आप बस जनहित याचिका विस्तार से फ़ाइल प्रकार मिलता है में सक्षम होना चाहिए, यानी उपयोग:

j.save("C:/Users/User/Desktop/mesh_trans.bmp") 
+0

+1, एक बेहतर विकल्प की तरह लगता है :) – RocketDonkey

+0

इनपुट के लिए धन्यवाद। हालांकि जब मैं सेव फ़ंक्शन को फ़ाइल टाइप प्राप्त करने की कोशिश करता हूं जैसा आपने ऊपर सुझाया है तो मुझे निम्न त्रुटि मिलती है: IOError: मोड एफ को बीएमपी के रूप में नहीं लिख सकता है। कोई सलाह? – user1999274

+0

हां, आपको सरणी को फ्लोट के बजाय 'numpy.uint8' dtype में परिवर्तित करना चाहिए। – wim

3

, लेकिन मैं मिल गया है:

यहाँ एक सुझाव (अन्य मामूली संशोधनों के साथ, fftshift और numpy.asarray के बजाय numpy.array का उपयोग कर की तरह) है उचित दृश्य के लिए रूपांतरण करने के लिए जो open(fp, 'w') का उपयोग कर फ़ाइल खोल रहा है और फिर फ़ाइल को सहेजने पर काम करेगा। उदा:

j.save(open(fp, 'w')) 

fp निश्चित रूप से फ़ाइल पथ, किया जा रहा है। (यह तकिया के साथ है)