पाइथन में टीआईएफएस (आयात, निर्यात) के साथ काम करते हुए सुन्न


84

मुझे TIFF छवियों को सुपीरियर सरणियों में खोलने और आयात करने के लिए एक अजगर विधि की आवश्यकता है ताकि मैं पिक्सेल डेटा का विश्लेषण और संशोधित कर सकूं और फिर उन्हें TIFF के रूप में सहेज सकूं। (वे मूल रूप से greyscale में प्रकाश की तीव्रता के नक्शे हैं, प्रति पिक्सेल संबंधित मूल्यों का प्रतिनिधित्व करते हैं)

टीआईएफएफ से संबंधित जनहित याचिकाओं पर मुझे कोई दस्तावेज नहीं मिला। मैंने इसका पता लगाने की कोशिश की, लेकिन केवल "खराब मोड" या "फ़ाइल प्रकार समर्थित नहीं" त्रुटियां मिलीं।

मुझे यहां क्या उपयोग करने की आवश्यकता है?

जवाबों:


103

सबसे पहले, मैंने नामक इस पृष्ठ से एक परीक्षण झगड़ा छवि डाउनलोड की 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-बिट सरणियों को संभालता है।
jterrace

@ जून 2020 तक जैकब पीआईएल प्रति रंग 8 बिट से अधिक के साथ रंगीन छवियों का समर्थन नहीं करता है , आपको एक अलग लाइब्रेरी का उपयोग करना होगा (या स्वयं कार्यक्षमता का योगदान करना होगा)।
बोरिस

56

मैं TIFF फ़ाइलों को पढ़ने के लिए matplotlib का उपयोग करता हूं:

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

और Iप्रकार के होंगे ndarray

प्रलेखन के अनुसार हालांकि यह वास्तव में पीआईएल है जो टीआईएफएस को मैटप्लोटलिब के रूप में संभालने के दौरान पर्दे के पीछे काम करता है, केवल पीएनजी को मूल रूप से पढ़ता है, लेकिन यह मेरे लिए ठीक काम कर रहा है।

plt.imsaveबचत के लिए एक फ़ंक्शन भी है ।


यह TIFF के साथ काम करने का सबसे आसान तरीका है! एक दर्जन तरीके से कोशिश की और यह सब टिकट था। के लिए सुनिश्चित करें!
zachd1_618

देखने के हिस्से के बारे में कैसे?
मोनिका हेडडेक

5
ऐसा लगता है कि matplotlib ने रणनीति बदल दी:ValueError: Only know how to handle extensions: ['png']; with Pillow installed matplotlib can handle more images
strpeter

17

आप ऐसा करने के लिए GDAL का उपयोग भी कर सकते हैं। मुझे लगता है कि यह एक भू-स्थानिक टूलकिट है, लेकिन कुछ भी नहीं है कि आप एक कार्टोग्राफिक उत्पाद है।

खिड़कियों के लिए पूर्वनिर्मित GDAL बायनेरिज़ से लिंक करें (यहाँ विंडोज़ को देखते हुए) 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()

क्या एकल TIF या TIF को गुणा करने के लिए उपरोक्त कोड है? मैं गदर का उपयोग 16 बिट टिफ़ स्टैक को नैपरेज़ में लोड करने के लिए करना चाहूंगा।
user391339

यह या तो इनपुट डेटा प्रकार में पढ़ा जाना चाहिए या सब कुछ numpy के float64 पर ले जाना चाहिए। आप .astype(sometype)कॉल करने के लिए कॉल के अंत में कॉल जोड़ सकते हैं ReadAsArray()। यकीन नहीं है कि यह एक प्रतिलिपि बनाता है (बस परीक्षण नहीं किया है)।
Jzl5325

@ चीकिन रिव्यू से: stackoverflow.com/review/suggested-edits/17962780 xrange कोई टाइपो नहीं xrangeहै, अजगर 2 संस्करण है range। मैंने इस संपादन को स्वीकार कर लिया क्योंकि अजगर 3 अभी भी सक्रिय रूप से सुधरा जा रहा है जबकि अजगर 2 नहीं है।
abccd

12

pylibtiff ने मेरे लिए PIL से बेहतर काम किया, जो कि जून 2020 तक प्रति रंग 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)

आप के साथ pylibtiff स्थापित कर सकते हैं

pip3 install numpy libtiff

पाइलिबिटिफ़ की रीडमी भी उल्लेख करती है tifffile, लेकिन मैंने इसे आज़माया नहीं है और जब तक यह खुले तौर पर खुला स्रोत है, मुझे नहीं लगता कि कोड कहीं भी उपलब्ध नहीं है (इसके अलावा इसे मैन्युअल रूप से PyPI पैकेज से निकालने के लिए)।


2
यह बहुत अच्छा है। अब तक, टाइफाइल को स्किटिट स्किमेज.एक्सटेरियन.टाइफाइल में शामिल किया गया है, लेकिन इसे एक मॉड्यूल के रूप में भी आयात किया जा सकता है यदि आप मिस्टर क्रिस्टोफ गोहले से टिफिफाइलहोम को डाउनलोड करते हैं
1530

7

तुम भी pytiff का उपयोग कर सकते हैं जो मैं लेखक हूँ।

    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]

यह एक काफी छोटा मॉड्यूल है और इसमें अन्य मॉड्यूल के रूप में कई विशेषताएं नहीं हो सकती हैं, लेकिन यह टाइल वाले टिफ़ और बिगटी का समर्थन करता है, इसलिए आप बड़ी छवियों के कुछ हिस्सों को पढ़ सकते हैं।


यह सुविधा वास्तव में मुझे क्या चाहिए! (एक बड़ी फ़ाइल का एक छोटा हिस्सा पढ़ने में सक्षम होने के नाते)। हालांकि जब मैं इसे स्थापित करने की कोशिश करता हूं तो मुझे एक जीसीसी त्रुटि
मिलती है

यदि आप त्रुटि संदेश के साथ कोई समस्या बनाते हैं , तो मैं देखूंगा कि क्या मैं समस्या का पता लगा सकता हूं।
hnfl

हां, मुझे भी दिलचस्पी है लेकिन जब मैंने इसे स्थापित करने का प्रयास किया तो एक त्रुटि भी हुई। मैंने पाइप के माध्यम से ऐसा किया - विंडोज के तहत और उबंटू के तहत। यह दुर्भाग्यपूर्ण है कि यह काम नहीं करता है! मैंने यहाँ एक मुद्दा बनाया है: github.com/FZJ-INM1-BDA/pytiff/issues/15
Dobedani

6

छवि के ढेर के मामले में, मुझे scikit-imageपढ़ने, और matplotlibदिखाने या बचाने के लिए उपयोग करना आसान लगता है । मैंने निम्नलिखित कोड के साथ 16-बिट TIFF छवि स्टैक को संभाला है।

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)

0

मैं OpenImageIO को अजगर बाइंडिंग का उपयोग करने की सलाह देता हूं, यह vxx दुनिया में विभिन्न छवि प्रारूपों से निपटने के लिए मानक है। मैंने पीआईएल की तुलना में विभिन्न संपीड़न प्रकारों को पढ़ने में इसे अधिक विश्वसनीय पाया है।

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

जब तक आपके पास पहले से ही कंपाइलर न हों, विंडोज पर स्थापित करना असंभव है।
जिमी कार्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.