सवाल पायथन में टीआईएफएफ (आयात, निर्यात) के साथ काम करते हुए numpy का उपयोग कर


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

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

मुझे यहां उपयोग करने की क्या ज़रूरत है?


44
2017-09-27 13:01


मूल




जवाब:


सबसे पहले, मैंने एक परीक्षण टीआईएफएफ छवि डाउनलोड की है यह पन्ना बुलाया a_image.tif। तब मैंने इस तरह पीआईएल के साथ खोला:

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

यह इंद्रधनुष छवि दिखाया। एक numpy सरणी में बदलने के लिए, यह इतना आसान है:

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

60
2017-09-27 15:55



मुझे डेटा प्रकारों में परेशानी हो रही है। कुछ के लिए ठीक काम करता है, एफई। अगर मेरे पास मेरी सरणी में numpy.int16 संख्याएं हैं, लेकिन numpy.uint16 image.fromarray उपज के लिए: "TypeError: इस डेटा प्रकार को संभाल नहीं सकता" - Jakob
सेरारे के स्रोत को देखते हुए, ऐसा लगता है कि यह हस्ताक्षरित 16-बिट सरणी को संभालता है। - jterrace


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

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

तथा I प्रकार का होगा ndarray

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

एक भी है plt.imsave बचत के लिए समारोह।


36
2017-09-27 13:10



यह टीआईएफएफ के साथ काम करने का सबसे आसान तरीका है! एक दर्जन तरीकों का प्रयास किया और यह सब टिकट था। निश्चित रूप से उपरोक्त! - zachd1_618
देखने के हिस्से के बारे में कैसे? - Monica Heddneck


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

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

12
2017-09-27 14:33



एक टीआईएफ या मल्टीपाज टीआईएफ के लिए उपरोक्त कोड है? मैं ndpays में 16 बिट टिफ ढेर लोड करने के लिए gdal का उपयोग करना चाहता हूँ। - user391339
इसे इनपुट डेटा प्रकार में पढ़ना चाहिए या सब कुछ numpy के float64 पर ले जाना चाहिए। आप एक जोड़ सकते हैं .astype(sometype)के अंत तक कॉल करें ReadAsArray() कास्ट करने के लिए बुलाओ। सुनिश्चित नहीं है कि यह एक प्रतिलिपि बनाता है (अभी परीक्षण नहीं किया गया है)। - Jzl5325
समीक्षा से @Chikinn: stackoverflow.com/review/suggested-edits/17962780  xrange कोई टाइपो नहीं है, xrange पाइथन 2 संस्करण है range। मैंने इस संपादन को स्वीकार कर लिया क्योंकि पाइथन 3 अभी भी सक्रिय रूप से सुधार रहा है जबकि पायथन 2 नहीं है। - abccd


pylibtiff पीआईएल की तुलना में मेरे लिए बेहतर काम किया (जो प्रति रंग 8 बिट से अधिक रंग छवियों का समर्थन नहीं करता है)।

from libtiff import TIFF

tif = TIFF.open('filename.tif', mode='r')
# 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)

यदि आप Python3 पर हैं तो आप नहीं कर सकते हैं pip3 install libtiff। इसके बजाए, मैन्युअल रूप से स्थापित करें

git clone git@github.com:pearu/pylibtiff.git
python3 setup.py install

पिलिबिटिफ़ का रीडेम भी उल्लेख करता है tifffile.py, लेकिन मैंने कोशिश नहीं की है।


2
2017-07-05 00:30



यह बहुत अच्छा है। अब तक, साइफिट skimage.external.tifffile में tifffile शामिल है लेकिन इसे मॉड्यूल के रूप में भी आयात किया जा सकता है यदि आप श्री क्रिस्टोफ गोहल्के से tifffile.py डाउनलोड करते हैं - Zloy Smiertniy


आप भी उपयोग कर सकते हैं 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]

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


2
2017-11-17 08:23





छवि ढेर के मामले में, मुझे उपयोग करना आसान लगता है 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)

0
2017-07-01 14:24