আমি পিআইএল দিয়ে একটি চিত্র কীভাবে সংরক্ষণ করতে পারি?


119

আমি চিত্রগুলির ফুরিয়ার রূপান্তর সম্পাদন করতে আগে পাওয়া একটি পোস্ট ব্যবহার করে পাইথন চিত্র গ্রন্থাগার (পিআইএল) ব্যবহার করে কিছু চিত্র প্রক্রিয়াকরণ করেছি এবং আমি সেভ ফাংশনটি কাজ করতে পারি না। পুরো কোডটি ঠিকঠাক কাজ করে তবে ফলাফলের চিত্রটি এটি সংরক্ষণ করবে না:

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
আরে অনেক ধন্যবাদ এটি এখন নিখুঁত কাজ করে! এখন আমাকে যা করতে হবে তা হল সমস্ত পদক্ষেপগুলি বোঝার তবে এটি খুব খারাপ হবে না। সহায়তার জন্য আপনাকে অনেক ধন্যবাদ
ব্যবহারকারী 1999274

@ ব্যবহারকারী1999274 প্রধান পার্থক্য হ'ল fft2পরিবর্তিত rfft2ডেটার পরিবর্তে ব্যবহারের ক্ষেত্রে যা আমি পরে ব্যবহার করার বিন্দুটি দেখতে পাচ্ছি না। বাকিগুলি নিখুঁতভাবে প্রসাধনী, যেমন আপনি কোনও লগ ফ্যাক্টর প্রয়োগ না করে ফুরিয়ার রূপান্তরটি সঠিকভাবে দেখতে সক্ষম হবেন না। তারপরে স্বাভাবিককরণ হ'ল পরিসরে রূপান্তর করার জন্য জিনিসগুলিকে সাধারণ রাখা [0, 255]।
মিমজিপি

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
ইনপুট জন্য ধন্যবাদ। তবে আমি যখন উপরে প্রস্তাবিত মত সেভ ফাংশনটি ফাইল টাইপ পেতে দেওয়ার চেষ্টা করি তখন নীচের ত্রুটিটি পেয়েছি: আইওআরর: বিএমপি হিসাবে মোড F লিখতে পারে না। কোন পরামর্শ?
ব্যবহারকারী 1999274

1
হ্যাঁ, আপনার numpy.uint8ভাসমানের চেয়ে অ্যারেটি টাইপে রূপান্তর করা উচিত ।
Wim

6

এর .আগে অপসারণের চেষ্টা করুন .bmp(এটি BMPপ্রত্যাশার সাথে মিলছে না )। ত্রুটিটি থেকে আপনি দেখতে পাচ্ছেন, save_handlerউপরেরটি formatআপনার সরবরাহ করা উপরের আবরণ এবং পরে একটি ম্যাচ সন্ধান করছে SAVE। তবে object অবজেক্টের সংশ্লিষ্ট কী BMP(পরিবর্তে .BMP)।

আমি এ সম্পর্কে PILখুব বেশি কিছু জানি না , তবে আশেপাশে কিছু দ্রুত অনুসন্ধান করলে মনে হয় modeএটি চিত্রটির সাথে সমস্যা । এর সংজ্ঞা পরিবর্তন jকরা:

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

আমার পক্ষে কাজ করার জন্য মনে হয়েছে (তবে মনে রাখবেন যে আমার খুব কম জ্ঞান আছে PILতাই আমি @ এমএমজিপি এর সমাধানটি ব্যবহার হিসাবে পরামর্শ দেব / সে স্পষ্টভাবে জানে যে তারা কী করছে :))। ধরণের প্রকারের জন্য mode, আমি এই পৃষ্ঠাটি ব্যবহার করেছি - আশা করি সেখানে যে কোনও একটি পছন্দ আপনার জন্য কাজ করবে।


আমি Bmp এর পক্ষে .bmp অপসারণ করার চেষ্টা করেছি এবং এটি এখনও কার্যকর হয়নি। আমি এখন যে ত্রুটিটি পেয়েছি তা হ'ল: আইওআরর: বিএমপি হিসাবে মোড F লিখতে পারে না। আমি ডকুমেন্টেশনের জন্য পিআইএল পৃষ্ঠাগুলি পরীক্ষা করে দেখেছি এবং এটি .bmp ব্যবহার করার কথা বলেছে সামগ্রিকভাবে এখনও এটি কেন কাজ করছে না তা আমার কোনও ধারণা নেই।
ব্যবহারকারী 1999274

@ user1999274 একটি আপডেট পোস্ট করেছে যা দেখে মনে হয়েছিল আমার পক্ষে কাজ করে (বিস্তারিত অভাবের জন্য দুঃখিত - আমি পাশাপাশি যাওয়ার সাথে সাথে এটি পাইকিং :))।
রকেটডনকি

@ রকেটডনকি এটির চেয়ে খানিকটা স্মার্ট হয়ে উঠেছে, কারণ ফুরিয়ারের ফলাফলগুলিকে আরজিবি কালারস্পেসে রূপান্তর করা অর্থহীন চিত্র দেবে। কেবল কারণ এটি আর ব্যতিক্রম না করে, এর অর্থ এই নয় যে ফলাফলটি সঠিক।
মিমজিপি

@ মিমজিপি সম্মত হয়েছে - এজন্য আমি আপনার পছন্দ করলাম এবং আশা করি ওপি এটি গ্রহণ করবে :)
রকেটডনকি

4

আমি জানি যে এটি পুরানো, তবে আমি খুঁজে পেয়েছি (বালিশ ব্যবহার করার সময়) ব্যবহার করে ফাইলটি খোলার পরে ফাইলটি open(fp, 'w')সংরক্ষণ করার কাজ করবে। উদাহরণ:

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

fp অবশ্যই ফাইল পথ হচ্ছে।


1
বালিশের ডকুমেন্টেশন বলছে যে formatকোনও ফাইল অবজেক্ট ব্যবহার করা হলে প্যারামিটারটি ব্যবহার করা উচিত save। এটি কি প্রয়োজনীয় নয়?
রব রোজ

@ রবরোজ আমার পরীক্ষার সময়, যখন আমি উত্তর পোস্ট করলাম, তখন প্রয়োজনীয় প্রয়োজনের মতো আমি কিছুই পাইনি। তবে এটি এখন হতে পারে। কোনো পরীক্ষার আপনাকে যা প্রমাণ করে যদি প্রয়োজনীয় আমাকে জানাতে এবং আমি আমার উত্তর সম্পাদনা করব
necko
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.