浅谈python下tiff图像的读取和保存方法


Posted in Python onDecember 04, 2018

对比测试 scipy.misc PIL.Image libtiff.TIFF 三个库

输入:

1. (读取矩阵) 读入uint8、uint16、float32的lena.tif

2. (生成矩阵) 使用numpy产生随机矩阵,float64的mat

import numpy as np
from scipy import misc
from PIL import Image
from libtiff import TIFF 
#
# 读入已有图像,数据类型和原图像一致
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'>
# 产生随机矩阵,数据类型float64
np.random.seed(12345)
flt = np.random.randn(512, 512)   #<class 'numpy.float64'>
# 转换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'>

①对读取图像和随机矩阵的存储

# scipy.misc『不论输入数据是何类型,输出图像均为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位输出图像与输入数据类型保持一致,64位会存成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类型转换,会使输出图像灰度变换到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『输出图像与输入数据类型保持一致』
tif = TIFF.open('.\test\\randmat_TIFF.tif', mode='w') 
tif.write_image(flt, compression=None)
tif.close() #float64可以存储,但因BitsPerSample=64,一些图像软件不识别
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类型转换,会使输出图像灰度变换到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)

②图像或矩阵归一化对存储的影响

# 『使用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 直接转8bit或16bit都会超出阈值,要*255或*65535』
# 『如果没有astype的位数设置,float64会直接存成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结果同Image』

③TIFF读取和存储多帧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 
 #根据文档,应该是这样实现,但测试中不管是tif.read_image还是tif.iter_images读入的矩阵数值都有问题

#图像序列保存成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])
  #缩放成统一尺寸 
  im = im.resize((480, 480), Image.ANTIALIAS) 
  tif.write_image(im, compression = None)  
 out_tiff.close() 
 return

补充:libtiff读取多帧tiff图像

因为TIFF.open().read_image()和TIFF.open().iter_images()有问题,则换一种方式读

from libtiff import TIFFfile
tif = TIFFfile('.\test\lena32-3.tif')
samples, _ = tif.get_samples()

以上这篇浅谈python下tiff图像的读取和保存方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python内置数据类型详解
Aug 18 Python
将Python代码打包为jar软件的简单方法
Aug 04 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
在Pycharm中使用GitHub的方法步骤
Jun 13 Python
Python目录和文件处理总结详解
Sep 02 Python
Python post请求实现代码实例
Feb 28 Python
Python猜数字算法题详解
Mar 01 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
jupyter note 实现将数据保存为word
Apr 14 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 Python
Flask搭建一个API服务器的步骤
May 28 Python
对python3新增的byte类型详解
Dec 04 #Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 #Python
python 实现数字字符串左侧补零的方法
Dec 04 #Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 #Python
python无限生成不重复(字母,数字,字符)组合的方法
Dec 04 #Python
uwsgi+nginx部署Django项目操作示例
Dec 04 #Python
解决python中无法自动补全代码的问题
Dec 04 #Python
You might like
用文本文件制作留言板提示(下)
2006/10/09 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
Python使用gRPC传输协议教程
2018/10/16 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Django异步任务线程池实现原理
2019/12/17 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
英国著名药妆店:Superdrug
2021/02/13 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript