浅谈python下tiff图像的读取和保存方法
时间:2022-07-27
本文章向大家介绍浅谈python下tiff图像的读取和保存方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
对比测试 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('.testlena32.tif') #<class 'numpy.float32'
tif16 = misc.imread('.testlena16.tif') #<class 'numpy.uint16'
tif8 = misc.imread('.testlena8.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('.testlena32_scipy.tif', tif32) #-- 8bit(tif16和tif8同)
misc.imsave('.testrandmat64_scipy.tif', flt) #-- 8bit
misc.imsave('.testrandmat8_scipy.tif', z8) #-- 8bit(z16和z32同)
# PIL.Image『8位16位输出图像与输入数据类型保持一致,64位会存成32位』
Image.fromarray(tif32).save('.testlena32_Image.tif') #-- 32bit
Image.fromarray(tif16).save('.testlena16_Image.tif') #-- 16bit
Image.fromarray(tif8).save('.testlena8_Image.tif') #-- 8bit
Image.fromarray(flt).save('.testrandmat_Image.tif') #-- 32bit(flt.min~flt.max)
im = Image.fromarray(flt.astype(np.float32))
im.save('.testrandmat32_Image.tif') #-- 32bit(灰度值范围同上)
#『uint8和uint16类型转换,会使输出图像灰度变换到255和65535』
im = Image.frombytes('I;16', (512, 512), flt.tostring())
im.save('.testrandmat16_Image1.tif') #-- 16bit(0~65535)
im = Image.fromarray(flt.astype(np.uint16))
im.save('.testrandmat16_Image2.tif') #-- 16bit(0~65535)
im = Image.fromarray(flt.astype(np.uint8))
im.save('.testrandmat8_Image.tif') #-- 8bit(0~255)
# libtiff.TIFF『输出图像与输入数据类型保持一致』
tif = TIFF.open('.testrandmat_TIFF.tif', mode='w')
tif.write_image(flt, compression=None)
tif.close() #float64可以存储,但因BitsPerSample=64,一些图像软件不识别
tif = TIFF.open('.testrandmat32_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('.testrandmat16_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('.testrandmat16_norm_scipy.tif', z16Norm) #-- 8bit(0~255)
# 『使用Image,归一化后变成np.float64 直接转8bit或16bit都会超出阈值,要*255或*65535』
# 『如果没有astype的位数设置,float64会直接存成32bit』
im = Image.fromarray(z16Norm)
im.save('.testrandmat16_norm_Image.tif') #-- 32bit(0~1)
im = Image.fromarray(z16Norm.astype(np.float32))
im.save('.testrandmat16_norm_to32_Image.tif') #-- 32bit(灰度范围值同上)
im = Image.fromarray(z16Norm.astype(np.uint16))
im.save('.testrandmat16_norm_to16_Image.tif') #-- 16bit(0~1)超出阈值
im = Image.fromarray(z16Norm.astype(np.uint8))
im.save('.testrandmat16_norm_to8_Image.tif') #-- 8bit(0~1)超出阈值
im = Image.fromarray((z16Norm*65535).astype(np.uint16))
im.save('.testrandmat16_norm_to16_Image1.tif') #-- 16bit(0~65535)
im = Image.fromarray((z16Norm*255).astype(np.uint16))
im.save('.testrandmat16_norm_to16_Image2.tif') #-- 16bit(0~255)
im = Image.fromarray((z16Norm*255).astype(np.uint8))
im.save('.testrandmat16_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('.testlena32-3.tif')
samples, _ = tif.get_samples()
以上这篇浅谈python下tiff图像的读取和保存方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持网站事(zalou.cn)。
您可能感兴趣的文章:
- 利用python GDAL库读写geotiff格式的遥感影像方法
- 用python代码将tiff图片存储到jpg的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 七夕节脱单“神助攻”!AI教你写情话
- 手把手教你移动端AI应用开发(三)——部署环节关键代码最详解读
- 一次完整的JVM堆外内存泄漏故障排查记录
- Python 爬虫进阶必备 | 某视频数据分析平台加密参数分析(终于我还是手把手扣了代码)
- Python 爬虫进阶必备 | 某视频平台 sign 加密参数分析
- 进击吧!Pythonista(3/100)
- begin backup导致的故障恢复全过程
- 通过历史控制文件恢复Oracle数据库,只需这10步
- python应用(2):写个python程序给自己用
- 基于Prometheus+Grafana监控SQL Server数据库
- 手把手教你用R语言读取CSV文件
- 6个案例手把手教你用Python和OpenCV进行图像处理
- Android 10(Q)/11(R) 分区存储适配
- Usual*** CMS 8.0代码审计
- 由一条like语句引发的SQL注入新玩法