পাইপথনে টিপিএফএফ (আমদানি, রফতানি) নিয়ে কাজ করা নাম্পি using


88

টিআইএফএফ চিত্রগুলি ন্যালি অ্যারেগুলিতে খুলতে এবং আমদানির জন্য আমার একটি পাইথন পদ্ধতি দরকার যাতে আমি পিক্সেল ডেটা বিশ্লেষণ ও সংশোধন করতে পারি এবং তারপরে সেগুলি আবার টিআইএফএফ হিসাবে সংরক্ষণ করতে পারি। (এগুলি গ্রিক স্কেলে মূলত হালকা তীব্রতার মানচিত্র, প্রতিটি পিক্সেল সম্পর্কিত মানগুলি উপস্থাপন করে)

টিআইএফএফ সম্পর্কিত পিআইএল পদ্ধতিতে আমি কোনও নথিপত্র পাইনি। আমি এটি বের করার চেষ্টা করেছি, তবে কেবল "খারাপ মোড" বা "ফাইল টাইপ সমর্থিত নয়" ত্রুটি পেয়েছি।

আমার এখানে কী ব্যবহার করা দরকার?

উত্তর:


107

প্রথমত, আমি থেকে একটি পরীক্ষা TIFF ছবি ডাউনলোড করা এই পৃষ্ঠার নামক a_image.tif। তারপরে আমি এইভাবে পিআইএল দিয়ে খুললাম:

>>> from PIL import Image
>>> im = Image.open('a_image.tif')
>>> im.show()

এটি রামধনু চিত্র দেখিয়েছে। একটি নম্পী অ্যারে রূপান্তর করতে, এটি এত সহজ:

>>> import numpy
>>> imarray = numpy.array(im)

আমরা দেখতে পাচ্ছি যে চিত্রের আকার এবং অ্যারের আকারটি মিলে গেছে:

>>> imarray.shape
(44, 330)
>>> im.size
(330, 44)

এবং অ্যারেতে uint8মানগুলি রয়েছে :

>>> imarray
array([[  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       ..., 
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246],
       [  0,   1,   2, ..., 244, 245, 246]], dtype=uint8)

একবার অ্যারে সংশোধন করার পরে আপনি এটিকে আবার একটি পিআইএল চিত্রে পরিণত করতে পারেন:

>>> Image.fromarray(imarray)
<Image.Image image mode=L size=330x44 at 0x2786518>

4
আমি ডেটা ধরণের নিয়ে সমস্যায় পড়ছি। কারও কারও পক্ষে ভাল কাজ করে, যদি আমার অ্যারেতে numpy.int16 সংখ্যা থাকে তবে numpy.uint16 চিত্রের জন্য.ফ্রোমারে ফল দেয়: "TypeError: এই তথ্য প্রকারটি পরিচালনা করতে পারে না"
Jakob

4
ফ্রোমারেয়ের উত্সটি দেখে মনে হচ্ছে এটি এটি স্বাক্ষরযুক্ত 16-বিট অ্যারে পরিচালনা করে।
জেটেরেস

২০২০ সালের জুনে জ্যাকব পিআইএল রঙের প্রতি 8 টি বিটের বেশি রঙের চিত্রগুলিকে সমর্থন করে না , আপনাকে আলাদা একটি লাইব্রেরি ব্যবহার করতে হবে (বা নিজের কার্যকারিতাটি অবদান রাখতে হবে)।
বরিস

পিআইএল-এর জন্য খুব বড় একটি চিত্র খোলার চেষ্টা করার সময় আমি যা পেয়েছি তা এখানে রয়েছে:DecompressionBombError: Image size (900815608 pixels) exceeds limit of 178956970 pixels, could be decompression bomb DOS attack.
ডেভফারফু

57

টিআইএফএফ ফাইলগুলি পড়ার জন্য আমি ম্যাটপ্লটলিব ব্যবহার করি:

import matplotlib.pyplot as plt
I = plt.imread(tiff_file)

এবং Iটাইপ হবে ndarray

ডকুমেন্টেশন অনুসারে যদিও টিআইএফএফগুলি ম্যাটপ্ল্লোলিব কেবল স্থানীয়ভাবে পিএনজি পড়েন, তবে এটি আমার জন্য পর্দার পিছনে কাজ করে।

plt.imsaveসংরক্ষণের জন্য একটি ফাংশনও রয়েছে।


এটি টিআইএফএফগুলির সাথে কাজ করার সবচেয়ে সহজ উপায়! এক ডজন পথ চেষ্টা করে দেখেছি এই সমস্ত টিকিট। নিশ্চিত করুন!
zachd1_618

দেখার অংশটি কেমন?
মনিকা হেডনেক

6
দেখে মনে হচ্ছে ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
ম্যাটপ্লটলিব

18

এটি করতে আপনি জিডিএলও ব্যবহার করতে পারেন। আমি বুঝতে পারি যে এটি একটি জিওপ্যাটিয়াল টুলকিট, তবে কোনও কিছুর জন্য আপনার কোনও কার্টোগ্রাফিক পণ্য থাকতে হবে না।

উইন্ডোজের জন্য প্রাকম্পম্পিত জিডিএল বাইনারিগুলির লিঙ্ক (এখানে উইন্ডোজ অনুমান করে) http://www.gisinternals.com/sdk/

অ্যারে অ্যাক্সেস করতে:

from osgeo import gdal

dataset = gdal.Open("path/to/dataset.tiff", gdal.GA_ReadOnly)
for x in range(1, dataset.RasterCount + 1):
    band = dataset.GetRasterBand(x)
    array = band.ReadAsArray()

একক টিআইএফ বা মাল্টিপেজ টিআইএফ এর জন্য উপরের কোডটি কি? আমি জিডাল 16 টি বিট টিফ স্ট্যাকগুলি এনপ্যারিতে লোড করতে চাই।
ব্যবহারকারী 39131339

এটি কোনও হয় ইনপুট ডেটা টাইপতে পড়তে হবে বা সবকিছুকে নিমপির ফ্লোট 64 এ স্থানান্তর করতে হবে। কাস্ট করার জন্য আপনি কলটির .astype(sometype)শেষে একটি কল যুক্ত করতে পারেন ReadAsArray()। এটি কোনও অনুলিপি তৈরি করেছে কিনা তা নিশ্চিত নয় (কেবল পরীক্ষা করা হয়নি)।
Jzl5325

@Chikinn পর্যালোচনা থেকে: stackoverflow.com/review/suggested-edits/17962780 xrange , কোন টাইপো হয় xrangeএর পাইথন 2 সংস্করণ range। আমি এই সম্পাদনাটি গ্রহণ করেছি কারণ পাইথন 3 এখনও সক্রিয়ভাবে উন্নত হচ্ছে যখন পাইথন 2 নেই।
abccd

14

পাইলিবটিফ আমার জন্য পিআইএল এর চেয়ে ভাল কাজ করেছে, যা ২০২০ সালের ডিসেম্বর পর্যন্ত প্রতি রঙে 8 টিরও বেশি বিট সহ রঙিন চিত্রগুলি সমর্থন করে না

from libtiff import TIFF

tif = TIFF.open('filename.tif') # open tiff file in read mode
# read an image in the currect TIFF directory as a numpy array
image = tif.read_image()

# read all images in a TIFF file:
for image in tif.iter_images(): 
    pass

tif = TIFF.open('filename.tif', mode='w')
tif.write_image(image)

আপনি পাইলিবটিফ এর সাথে ইনস্টল করতে পারেন

pip3 install numpy libtiff

পাইলিবটিফের রিডমে tifffileলাইব্রেরির উল্লেখ রয়েছে তবে আমি এটি চেষ্টা করি নি।


4
এটা খুব ভাল. এতক্ষণে, টিফিলটি সায়কিট স্কাইমেজ.এক্সটার্ন.টিফফাইলে অন্তর্ভুক্ত করা হয়েছে তবে আপনি মিঃ ক্রিস্টোফ গহলকের কাছ থেকে tifffile.py ডাউনলোড করেন তবে এটি মডিউল হিসাবেও আমদানি করা যেতে পারে
লেসোলোর্জনভ

8

চিত্র স্ট্যাকের ক্ষেত্রে, আমি scikit-imageপড়তে এবং matplotlibদেখানো বা সংরক্ষণ করা ব্যবহার করা আরও সহজ করে দেখি। আমি নিম্নলিখিত কোড সহ 16-বিট টিআইএফএফ চিত্র স্ট্যাকগুলি পরিচালনা করেছি।

from skimage import io
import matplotlib.pyplot as plt

# read the image stack
img = io.imread('a_image.tif')
# show the image
plt.imshow(mol,cmap='gray')
plt.axis('off')
# save the image
plt.savefig('output.tif', transparent=True, dpi=300, bbox_inches="tight", pad_inches=0.0)

7

আপনি পাইটিফ ব্যবহার করতে পারেন যার মধ্যে আমি লেখক।

    import pytiff

    with pytiff.Tiff("filename.tif") as handle:
        part = handle[100:200, 200:400]

    # multipage tif
    with pytiff.Tiff("multipage.tif") as handle:
        for page in handle:
            part = page[100:200, 200:400]

এটি মোটামুটি ছোট একটি মডিউল এবং এতে অন্যান্য মডিউলগুলির মতো অনেকগুলি বৈশিষ্ট্য নাও থাকতে পারে তবে এটি টাইল্ড টিফস এবং বিগটিফ সমর্থন করে, যাতে আপনি বড় চিত্রগুলির অংশগুলি পড়তে পারেন।


4
এই বৈশিষ্ট্যটি ঠিক আমার যা প্রয়োজন! (একটি বড় ফাইলের একটি ছোট অংশ পড়তে সক্ষম হওয়া)। তবে যখন আমি এটি ইনস্টল করার
পাইপ

আপনি যদি ত্রুটি বার্তাটি দিয়ে একটি সমস্যা তৈরি করেন তবে আমি সমস্যার সমাধান করতে পারি কিনা তা আমি দেখতে পাচ্ছি।
এইচএনএফএল

হ্যাঁ, আমি আগ্রহী কিন্তু এটি ইনস্টল করার চেষ্টা করার সময় একটি ত্রুটিও পেয়েছি। আমি পাইপের মাধ্যমে তা করেছি - উইন্ডোজ এবং উবুন্টুর অধীনে। দুর্ভাগ্যজনক যে এটি কাজ করে না! আমি এখানে একটি সমস্যা তৈরি করেছি: github.com/FZJ-INM1-BDA/pytiff/issues/15
Dobedani

ইনস্টল করতে অক্ষম
সাদফ শফী

0

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

import OpenImageIO as oiio
input = oiio.ImageInput.open ("/path/to/image.tif")

আপনার ইতিমধ্যে সংকলক না থাকলে উইন্ডোজে ইনস্টল করা সীমানা অসম্ভব।
জিমি কার্টার

0

সিভি 2 ব্যবহার করে

import cv2
image = cv2.imread(tiff_file.tif)
cv2.imshow('tif image',image)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.