मैं पीआईएल के साथ एक छवि कैसे बचा सकता हूं?


119

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

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

मुझे मिलने वाली त्रुटि निम्नलिखित है:

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

मैं पायथन पीआईएल के साथ एक छवि कैसे बचा सकता हूं?

जवाबों:


144

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

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

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

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

1
visual = (visual - visual.min()) / (visual.max() - visual.min())डिफ़ॉल्ट होगा यदि visualकोई विचरण नहीं है (संभावना नहीं है, लेकिन पकड़ने लायक)

1
मैंने अपनी समस्या के लिए इस कोड का उपयोग करने की कोशिश की, लेकिन मुझे सादे काले चित्र मिलते हैं। क्या किसी को इस बारे में कोई विचार है? stackoverflow.com/questions/24266000/…
user961627

32

आपको केवल पीआईएल को विस्तार से फाइललाइट प्राप्त करने में सक्षम होना चाहिए, अर्थात उपयोग करें:

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

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

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

6

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

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

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

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


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

@ user1999274 ने एक अपडेट पोस्ट किया जो मुझे काम करने के लिए लग रहा था (विस्तार की कमी के लिए माफी - साथ में जाते हुए मुझे एक साथ मिलाना :)।
रॉकेटडोनकी

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

@mmgp सहमत - यही कारण है कि मैं तुम्हारा + हूँ और आशा है कि ओपी इसे स्वीकार करता है :)
RocketDonkey

4

मुझे पता है कि यह पुराना है, लेकिन मैंने पाया है कि (पिलो का उपयोग करते समय) फ़ाइल का उपयोग करके खोलना open(fp, 'w')और फिर फ़ाइल को सहेजना काम करेगा। उदाहरण के लिए:

with open(fp, 'w') as f:
    result.save(f)

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


1
तकिया का प्रलेखन कहता है कि formatयदि फ़ाइल ऑब्जेक्ट का उपयोग किया जाता है तो पैरामीटर का उपयोग किया जाना चाहिए save। क्या यह आवश्यक नहीं है?
रॉब रोज

मेरे परीक्षण के दौरान @RobRose, जब मैंने उत्तर पोस्ट किया, तो मुझे ऐसा कुछ भी नहीं मिला जो आवश्यक हो। हालाँकि, अब ऐसा हो सकता है। यदि आपके द्वारा किया गया कोई भी परीक्षण यह साबित करता है कि मुझे बताना आवश्यक है और मैं अपना उत्तर संपादित करूंगा
गर्दन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.