浅谈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中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
Python做简单的字符串匹配详解
Mar 21 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
python微信跳一跳游戏辅助代码解析
Jan 29 Python
pandas Dataframe行列读取的实例
Jun 08 Python
Python实现京东秒杀功能代码
May 16 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 Python
虚拟机下载python是否需要联网
Jul 27 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
python FTP编程基础入门
Feb 27 Python
python四种出行路线规划的实现
Jun 23 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
玩转图像函数库―常见图形操作
2006/09/03 PHP
php学习之运算符相关概念
2011/06/09 PHP
Php中使用Select 查询语句的实例
2014/02/19 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
javascript计时器详解
2015/02/28 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
python字符串连接方式汇总
2014/08/21 Python
python获取图片颜色信息的方法
2015/03/18 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
python 阶乘累加和的实例
2019/02/01 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
python支持多线程的爬虫实例
2019/12/21 Python
关于初始种子自动选取的区域生长实例(python+opencv)
2020/01/16 Python
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
法学研究生自我鉴定范文
2013/12/04 职场文书
公司门卫管理制度
2014/02/01 职场文书
学校四风对照检查材料
2014/08/28 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书