淺談python下tiff圖像的讀取和保存方法
對(duì)比測試 scipy.misc 和 PIL.Image 和 libtiff.TIFF 三個(gè)庫
輸入:
1. (讀取矩陣) 讀入uint8、uint16、float32的lena.tif
2. (生成矩陣) 使用numpy產(chǎn)生隨機(jī)矩陣,float64的mat
import numpy as np
from scipy import misc
from PIL import Image
from libtiff import TIFF
#
# 讀入已有圖像,數(shù)據(jù)類型和原圖像一致
tif32 = misc.imread('.\test\lena32.tif') #<class 'numpy.float32'>
tif16 = misc.imread('.\test\lena16.tif') #<class 'numpy.uint16'>
tif8 = misc.imread('.\test\lena8.tif') #<class 'numpy.uint8'>
# 產(chǎn)生隨機(jī)矩陣,數(shù)據(jù)類型float64
np.random.seed(12345)
flt = np.random.randn(512, 512) #<class 'numpy.float64'>
# 轉(zhuǎn)換float64矩陣type,為后面作測試
z8 = (flt.astype(np.uint8)) #<class 'numpy.uint8'>
z16 = (flt.astype(np.uint16)) #<class 'numpy.uint16'>
z32 = (flt.astype(np.float32)) #<class 'numpy.float32'>
①對(duì)讀取圖像和隨機(jī)矩陣的存儲(chǔ)
# scipy.misc『不論輸入數(shù)據(jù)是何類型,輸出圖像均為uint8』
misc.imsave('.\test\lena32_scipy.tif', tif32) #--> 8bit(tif16和tif8同)
misc.imsave('.\test\\randmat64_scipy.tif', flt) #--> 8bit
misc.imsave('.\test\\randmat8_scipy.tif', z8) #--> 8bit(z16和z32同)
# PIL.Image『8位16位輸出圖像與輸入數(shù)據(jù)類型保持一致,64位會(huì)存成32位』
Image.fromarray(tif32).save('.\test\lena32_Image.tif') #--> 32bit
Image.fromarray(tif16).save('.\test\lena16_Image.tif') #--> 16bit
Image.fromarray(tif8).save('.\test\lena8_Image.tif') #--> 8bit
Image.fromarray(flt).save('.\test\\randmat_Image.tif') #--> 32bit(flt.min~flt.max)
im = Image.fromarray(flt.astype(np.float32))
im.save('.\test\\randmat32_Image.tif') #--> 32bit(灰度值范圍同上)
#『uint8和uint16類型轉(zhuǎn)換,會(huì)使輸出圖像灰度變換到255和65535』
im = Image.frombytes('I;16', (512, 512), flt.tostring())
im.save('.\test\\randmat16_Image1.tif') #--> 16bit(0~65535)
im = Image.fromarray(flt.astype(np.uint16))
im.save('.\test\\randmat16_Image2.tif') #--> 16bit(0~65535)
im = Image.fromarray(flt.astype(np.uint8))
im.save('.\test\\randmat8_Image.tif') #--> 8bit(0~255)
# libtiff.TIFF『輸出圖像與輸入數(shù)據(jù)類型保持一致』
tif = TIFF.open('.\test\\randmat_TIFF.tif', mode='w')
tif.write_image(flt, compression=None)
tif.close() #float64可以存儲(chǔ),但因BitsPerSample=64,一些圖像軟件不識(shí)別
tif = TIFF.open('.\test\\randmat32_TIFF.tif', mode='w')
tif.write_image(flt.astype(np.float32), compression=None)
tif.close() #--> 32bit(flt.min~flt.max)
#『uint8和uint16類型轉(zhuǎn)換,會(huì)使輸出圖像灰度變換到255和65535』
tif = TIFF.open('.\test\\randmat16_TIFF.tif', mode='w')
tif.write_image(flt.astype(np.uint16), compression=None)
tif.close() #--> 16bit(0~65535,8位則0~255)
②圖像或矩陣歸一化對(duì)存儲(chǔ)的影響
# 『使用scipy,只能存成uint8』
z16Norm = (z16-np.min(z16))/(np.max(z16)-np.min(z16)) #<class 'numpy.float64'>
z32Norm = (z32-np.min(z32))/(np.max(z32)-np.min(z32))
scipy.misc.imsave('.\test\\randmat16_norm_scipy.tif', z16Norm) #--> 8bit(0~255)
# 『使用Image,歸一化后變成np.float64 直接轉(zhuǎn)8bit或16bit都會(huì)超出閾值,要*255或*65535』
# 『如果沒有astype的位數(shù)設(shè)置,float64會(huì)直接存成32bit』
im = Image.fromarray(z16Norm)
im.save('.\test\\randmat16_norm_Image.tif') #--> 32bit(0~1)
im = Image.fromarray(z16Norm.astype(np.float32))
im.save('.\test\\randmat16_norm_to32_Image.tif') #--> 32bit(灰度范圍值同上)
im = Image.fromarray(z16Norm.astype(np.uint16))
im.save('.\test\\randmat16_norm_to16_Image.tif') #--> 16bit(0~1)超出閾值
im = Image.fromarray(z16Norm.astype(np.uint8))
im.save('.\test\\randmat16_norm_to8_Image.tif') #--> 8bit(0~1)超出閾值
im = Image.fromarray((z16Norm*65535).astype(np.uint16))
im.save('.\test\\randmat16_norm_to16_Image1.tif') #--> 16bit(0~65535)
im = Image.fromarray((z16Norm*255).astype(np.uint16))
im.save('.\test\\randmat16_norm_to16_Image2.tif') #--> 16bit(0~255)
im = Image.fromarray((z16Norm*255).astype(np.uint8))
im.save('.\test\\randmat16_norm_to8_Image2.tif') #--> 8bit(0~255)
# 『使用TIFF結(jié)果同Image』
③TIFF讀取和存儲(chǔ)多幀tiff圖像
#tiff文件解析成圖像序列:讀取tiff圖像 def tiff_to_read(tiff_image_name): tif = TIFF.open(tiff_image_name, mode = "r") im_stack = list() for im in list(tif.iter_images()): im_stack.append(im) return #根據(jù)文檔,應(yīng)該是這樣實(shí)現(xiàn),但測試中不管是tif.read_image還是tif.iter_images讀入的矩陣數(shù)值都有問題 #圖像序列保存成tiff文件:保存tiff圖像 def write_to_tiff(tiff_image_name, im_array, image_num): tif = TIFF.open(tiff_image_name, mode = 'w') for i in range(0, image_num): im = Image.fromarray(im_array[i]) #縮放成統(tǒng)一尺寸 im = im.resize((480, 480), Image.ANTIALIAS) tif.write_image(im, compression = None) out_tiff.close() return
補(bǔ)充:libtiff讀取多幀tiff圖像
因?yàn)門IFF.open().read_image()和TIFF.open().iter_images()有問題,則換一種方式讀
from libtiff import TIFFfile
tif = TIFFfile('.\test\lena32-3.tif')
samples, _ = tif.get_samples()
以上這篇淺談python下tiff圖像的讀取和保存方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Python實(shí)現(xiàn)讀取mat、tif和hdr格式數(shù)據(jù)
- Python讀取TIF影像的多種方法
- python讀取與寫入tif圖片的完整信息(過程詳解)
- Python讀取hdf文件并轉(zhuǎn)化為tiff格式輸出
- 利用Python裁切tiff圖像且讀取tiff,shp文件的實(shí)例
- python讀取tif圖片時(shí)保留其16bit的編碼格式實(shí)例
- Python模塊_PyLibTiff讀取tif文件的實(shí)例
- 對(duì)Python3+gdal 讀取tiff格式數(shù)據(jù)的實(shí)例講解
- Python讀取TIF文件的兩種方法實(shí)現(xiàn)
相關(guān)文章
解讀pandas交叉表與透視表pd.crosstab()和pd.pivot_table()函數(shù)
這篇文章主要介紹了pandas交叉表與透視表pd.crosstab()和pd.pivot_table()函數(shù)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
python中計(jì)算一個(gè)列表中連續(xù)相同的元素個(gè)數(shù)方法
今天小編就為大家分享一篇python中計(jì)算一個(gè)列表中連續(xù)相同的元素個(gè)數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python 經(jīng)典算法100及解析(小結(jié))
這篇文章主要介紹了Python 經(jīng)典算法100及解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python爬蟲使用瀏覽器cookies:browsercookie過程解析
這篇文章主要介紹了Python爬蟲使用瀏覽器cookies:browsercookie,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Pandas中DataFrame.drop()函數(shù)的具體使用
DataFrame.drop是Pandas庫中一個(gè)非常實(shí)用的函數(shù),用于刪除 DataFrame中的行或列,本文就來介紹一下Pandas中DataFrame.drop()函數(shù)的具體使用,感興趣的可以了解一下2024-07-07
Python實(shí)現(xiàn)簡單文本字符串處理的方法
這篇文章主要介紹了Python實(shí)現(xiàn)簡單文本字符串處理的方法,涉及Python針對(duì)文本字符串的切割、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01

