浅谈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实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
Python爬虫爬取美剧网站的实现代码
Sep 03 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
python 构造三维全零数组的方法
Nov 12 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
NumPy排序的实现
Jan 21 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
Feb 27 Python
Python 字典中的所有方法及用法
Jun 10 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Python time库的时间时钟处理
May 02 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
PHP 中的类
2006/10/09 PHP
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
小谈php正则提取图片地址
2014/03/27 PHP
smarty缓存用法分析
2014/12/16 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
Javascript删除数组里的某个元素
2019/02/28 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
毕业生自荐信
2013/12/14 职场文书
预备党员政审材料
2014/02/04 职场文书
企业工会工作总结2015
2015/05/13 职场文书
鲁冰花观后感
2015/06/10 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python