浅谈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 相关文章推荐
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
python读写json文件的简单实现
Apr 11 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
python处理Excel xlrd的简单使用
Sep 12 Python
Pycharm远程调试openstack的方法
Nov 21 Python
在Python 中同一个类两个函数间变量的调用方法
Jan 31 Python
django 多对多表的创建和插入代码实现
Sep 09 Python
Python根据服务获取端口号的方法
Sep 25 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
Python学习之os模块及用法
Jun 03 Python
Python如何读取、写入CSV数据
Jul 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
推荐个功能齐全的发送PHP邮件类
2007/01/03 PHP
php 时间计算问题小结
2009/01/04 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
Python获取文件ssdeep值的方法
2014/10/05 Python
Python简单进程锁代码实例
2015/04/27 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
财务与信息服务专业推荐信
2013/11/28 职场文书
葬礼司仪主持词
2014/03/31 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
2015秋季田径运动会广播稿
2015/08/19 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
MySQL约束超详解
2021/09/04 MySQL
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android