对Python3+gdal 读取tiff格式数据的实例讲解


Posted in Python onDecember 04, 2018

1、遇到的问题:numpy版本

im_data = dataset.ReadAsArray(0,0,im_width,im_height)#获取数据 这句报错

升级numpy:pip install -U numpy 但是提示已经是最新版本

解决:卸载numpy 重新安装

2.直接从压缩包中读取tiff图像

参考:http://gdal.org/gdal_virtual_file_systems.html#gdal_virtual_file_systems_vsizip

当前情况是2层压缩: /'/vsitar/C:/Users/summer/Desktop/a_PAN1.tiff'

3.读tiff

def readTif(fileName):
	
	merge_img = 0
	driver = gdal.GetDriverByName('GTiff')
	driver.Register()
 
	dataset = gdal.Open(fileName)
	if dataset == None:
		print(fileName+ "掩膜失败,文件无法打开")
		return
	im_width = dataset.RasterXSize #栅格矩阵的列数
	print('im_width:', im_width) 
 
	im_height = dataset.RasterYSize #栅格矩阵的行数
	print('im_height:', im_height) 
	im_bands = dataset.RasterCount #波段数
	im_geotrans = dataset.GetGeoTransform()#获取仿射矩阵信息
	im_proj = dataset.GetProjection()#获取投影信息
	
 
	if im_bands == 1:
		band = dataset.GetRasterBand(1)
		im_data = dataset.ReadAsArray(0,0,im_width,im_height) #获取数据
		cdata = im_data.astype(np.uint8)
		merge_img = cv2.merge([cdata,cdata,cdata])
 
		cv2.imwrite('C:/Users/summer/Desktop/a.jpg', merge_img)
# 
	elif im_bands == 4:
	# 	# im_data = dataset.ReadAsArray(0,0,im_width,im_height)#获取数据
	# 	# im_blueBand = im_data[0,0:im_width,0:im_height] #获取蓝波段
	# 	# im_greenBand = im_data[1,0:im_width,0:im_height] #获取绿波段
	# 	# im_redBand = im_data[2,0:im_width,0:im_height] #获取红波段
	# 	# # im_nirBand = im_data[3,0:im_width,0:im_height] #获取近红外波段
	# 	# merge_img=cv2.merge([im_redBand,im_greenBand,im_blueBand])
 
	# 	# zeros = np.zeros([im_height,im_width],dtype = "uint8")
 
	# 	# data1 = im_redBand.ReadAsArray
 
	# 	band1=dataset.GetRasterBand(1)
	# 	band2=dataset.GetRasterBand(2)
	# 	band3=dataset.GetRasterBand(3)
	# 	band4=dataset.GetRasterBand(4)
	
		data1=band1.ReadAsArray(0,0,im_width,im_height).astype(np.uint16) #r #获取数据
		data2=band2.ReadAsArray(0,0,im_width,im_height).astype(np.uint16) #g #获取数据
		data3=band3.ReadAsArray(0,0,im_width,im_height).astype(np.uint16) #b #获取数据
		data4=band4.ReadAsArray(0,0,im_width,im_height).astype(np.uint16) #R #获取数据
	# 	print(data1[1][45])
	# 	output1= cv2.convertScaleAbs(data1, alpha=(255.0/65535.0))
	# 	print(output1[1][45])
	# 	output2= cv2.convertScaleAbs(data2, alpha=(255.0/65535.0))
	# 	output3= cv2.convertScaleAbs(data3, alpha=(255.0/65535.0))
 
		merge_img1 = cv2.merge([output3,output2,output1]) #B G R
		
		cv2.imwrite('C:/Users/summer/Desktop/merge_img1.jpg', merge_img1)

4.图像裁剪:

import cv2
import numpy as np
import os
 
tiff_file = './try_img/2.tiff'
save_folder = './try_img_re/'
if not os.path.exists(save_folder):
	os.makedirs(save_folder)
 
tif_img = cv2.imread(tiff_file)
width, height, channel = tif_img.shape
# print height, width, channel : 6908 7300 3
threshold = 1000
overlap = 100
 
step = threshold - overlap
x_num = width/step + 1
y_num = height/step + 1
print x_num, y_num
 
N = 0
yj = 0 
 
for xi in range(x_num):
	for yj in range(y_num):
	# print xi
		if yj <= y_num:
			print yj
			x = step*xi
	  y = step*yj
 
	  wi = min(width,x+threshold)
	  hi = min(height,y+threshold)
	  # print wi , hi
 
	  if wi-x < 1000 and hi-y < 1000:
	  	im_block = tif_img[wi-1000:wi, hi-1000:hi]
 
	  elif wi-x > 1000 and hi-y < 1000:
	  	im_block = tif_img[x:wi, hi-1000:hi]
 
	  elif wi-x < 1000 and hi-y > 1000:
	  	im_block = tif_img[wi-1000:wi, y:hi]
 
	 	else:
	  	im_block = tif_img[x:wi,y:hi]
	  	
	  cv2.imwrite(save_folder + 'try' + str(N) + '.jpg', im_block)
	  N += 1

以上这篇对Python3+gdal 读取tiff格式数据的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
跟老齐学Python之有容乃大的list(3)
Sep 15 Python
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
Python循环语句之break与continue的用法
Oct 14 Python
简单实现python进度条脚本
Dec 18 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
Pycharm取消py脚本中SQL识别的方法
Nov 29 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
Python通过文本和图片生成词云图
May 21 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
Python学习之os包使用教程详解
Mar 21 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 #Python
浅谈python下tiff图像的读取和保存方法
Dec 04 #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
You might like
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
Yii rules常用规则示例
2016/03/15 PHP
AJAX的使用方法详解
2017/04/29 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
json字符串传到前台input的方法
2018/08/06 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
django文档学习之applications使用详解
2018/01/29 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
深入理解Python异常处理的哲学
2019/02/01 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
大学生应聘推荐信范文
2013/11/19 职场文书
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
献爱心倡议书
2014/04/14 职场文书
法制宣传口号
2014/06/16 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
会计做账心得体会
2016/01/22 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS