前言

任务原因,遇到了一个需要GDAL图像像素格式与OpenCV相互转换的问题,解决之后顺便记录一下。

正文

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,通过cv2.imread()读取的图像像素数组格式为(Width,Height,BandNum)。需要注意的是,通过OpenCV读入的彩色图像是BGR模式。

GDAL(Geospatial Data Abstraction Library)是栅格和矢量地理数据的转换库,是十分强大的图像数据读入方式,支持的图像类型十分广泛,读取地理栅格数据一般都使用GDAL。通过gdal.Open().ReadAsArray()读取的图像像素数组格式为(BandNum,Width,Height)。

转换代码如下:

import gdal
import cv2
import numpy as np#读取tif数据集
def readTif(fileName):dataset = gdal.Open(fileName)if dataset == None:print(fileName+"文件无法打开")return dataset#获取投影信息
def Getproj(fileName):dataset = readTif(fileName)return dataset.GetProjection()#获取仿射矩阵信息
def Getgeotrans(fileName):dataset = readTif(fileName)return dataset.GetGeoTransform()#opencv数据转gdal
def OpencvData2GdalData(OpencvImg_data):# 若为二维,格式相同if(len(OpencvImg_data.shape) == 2):GdalImg_data = OpencvImg_dataelse:if 'int8' in OpencvImg_data.dtype.name:GdalImg_data = np.zeros((OpencvImg_data.shape[2],OpencvImg_data.shape[0],OpencvImg_data.shape[1]),np.uint8)elif 'int16' in OpencvImg_data.dtype.name:GdalImg_data = np.zeros((OpencvImg_data.shape[2],OpencvImg_data.shape[0],OpencvImg_data.shape[1]),np.uint16)else:GdalImg_data = np.zeros((OpencvImg_data.shape[2],OpencvImg_data.shape[0],OpencvImg_data.shape[1]),np.float32)for i in range(OpencvImg_data.shape[2]):# 注意,opencv为BGRdata = OpencvImg_data[:,:,OpencvImg_data.shape[2]-i-1]data = np.reshape(data,(OpencvImg_data.shape[0],OpencvImg_data.shape[1]))GdalImg_data[i] = datareturn GdalImg_data#opencv数据转gdal
def GdalData2OpencvData(GdalImg_data):if 'int8' in GdalImg_data.dtype.name:OpencvImg_data = np.zeros((GdalImg_data.shape[1],GdalImg_data.shape[2],GdalImg_data.shape[0]),np.uint8)elif 'int16' in GdalImg_data.dtype.name:OpencvImg_data = np.zeros((GdalImg_data.shape[1],GdalImg_data.shape[2],GdalImg_data.shape[0]),np.uint16)else:OpencvImg_data = np.zeros((GdalImg_data.shape[1],GdalImg_data.shape[2],GdalImg_data.shape[0]),np.float32)for i in range(GdalImg_data.shape[0]):OpencvImg_data[:,:,i] = GdalImg_data[GdalImg_data.shape[0]-i-1,:,:]return OpencvImg_data#保存tif文件函数
def writeTiff(im_data,im_geotrans,im_proj,path):if 'int8' in im_data.dtype.name:datatype = gdal.GDT_Byteelif 'int16' in im_data.dtype.name:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32if len(im_data.shape) == 3:im_bands, im_height, im_width = im_data.shapeelif len(im_data.shape) == 2:im_data = np.array([im_data])im_bands, im_height, im_width = im_data.shape#创建文件driver = gdal.GetDriverByName("GTiff")dataset = driver.Create(path, int(im_width), int(im_height), int(im_bands), datatype)if(dataset!= None):dataset.SetGeoTransform(im_geotrans) #写入仿射变换参数dataset.SetProjection(im_proj) #写入投影for i in range(im_bands):dataset.GetRasterBand(i+1).WriteArray(im_data[i])del dataset# 测试OpenCV转gdal
proj = Getproj("1.tif")
geotrans = Getgeotrans("1.tif")
OpencvImg_data = cv2.imread("1.tif")
GdalImg_data = OpencvData2GdalData(OpencvImg_data)
writeTiff(GdalImg_data,geotrans,proj,"2.tif")
# 测试gdal转OpenCV
dataset = readTif("1.tif")
width = dataset.RasterXSize #栅格矩阵的列数
height = dataset.RasterYSize #栅格矩阵的行数
GdalImg_data = dataset.ReadAsArray(0,0,width,height)#获取数据
OpencvImg_data = GdalData2OpencvData(GdalImg_data)
cv2.imwrite("3.tif",OpencvImg_data)

后记

如有问题,欢迎交流批评指正。

dataset中获取图像的名字_GDAL与OpenCV的图像像素读取格式互相转换相关推荐

  1. OpenCV(三) 图像的读取和显示

    OpenCV中的C++类和函数都是定义在命名空间cv之内的,有两种方法可以访问. 第一种是,在代码开头的适当位置,加上 usingnamespace cv; 这句. 另外一种是在使用OpenCV类和函 ...

  2. Opencv -- 18图像像素类型转换与归一化

    原文笔记参考(转载)链接:https://www.freesion.com/article/48551470037/. 什么是归一化 概念一:归一化是把需要处理的数据通过某种算法处理后限制在所需要的一 ...

  3. python打开文件夹中的tiff_浅谈python下tiff图像的读取和保存方法

    对比测试 scipy.misc和 PIL.Image和 libtiff.TIFF三个库 输入: 1. (读取矩阵) 读入uint8.uint16.float32的lena.tif 2. (生成矩阵) ...

  4. opencv 修改图像像素

    #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgu ...

  5. opencv之 图像像素操作(如何通过opencv在图像上划线)

    首先我们了解,一个图像,都是一个大的二维数组,每一个元素都是一个像素,若是rgb图像,则该像素还会有rgb三个值,我们读入一个图像 import cv2img = cv2.imread("o ...

  6. OpenCV计算图像像素最大值、最小值

      第一种方法: Mat img = imread("./1.jpg", 0); double minVal = 0.0; double maxVal = 0.0; minMaxL ...

  7. OpenCV之图像像素归一化

    python代码: import cv2 as cv import numpy as npsrc = cv.imread("./test.png") cv.namedWindow( ...

  8. python 读取图片成为一维数组_在OpenCV里图像数据与一维数组转换

    通过读取文件之后,生成的图像数据一般是二维或三维数组,每个数组元素是8位字节大小.有时候从网络里接收到一串数据,它是字节顺序的,比如有30000个字节,想要把它转换为300X100的图像大小,这个怎么 ...

  9. 在OpenCV里图像数据与一维数组转换

    通过读取文件之后,生成的图像数据一般是二维或三维数组,每个数组元素是8位字节大小.有时候从网络里接收到一串数据,它是字节顺序的,比如有30000个字节,想要把它转换为300X100的图像大小,这个怎么 ...

最新文章

  1. python中怎么比较两个列表-python中如何比较两个列表不同
  2. 华为首款鸿蒙系统产品成行业,华为首款鸿蒙系统产品成行业公敌!只因开机无广告:遭十大品牌批评...
  3. python自动复制_Python自动复制日志,python,拷贝
  4. 从使用 KVO 监听 readonly 属性说起
  5. springboot记录用户访问次数_SpringBoot中自定义注解实现控制器访问次数限制示例...
  6. 支付宝sdk java对接_java后台支付宝app支付调用sdk进行支付
  7. 合作、高效 -- 下一代汽车电子软件开发与测试论坛
  8. html网站a标签直接下载pdf,不在浏览器打开
  9. Oracle数据库使用教程
  10. python开发环境android版_Android NDK开发环境安装(OK版)
  11. kubernetes Pod Lifecycle生命周期与livenessProbe、 readinessProbe探测方法
  12. 安卓工作室 android studio 的 汉化 美化 定制 Android studio's Chinesization beautification customization
  13. VLC WebPlugin中文
  14. rsync+inotify实现文件增量实时同步
  15. 基于L298N的微型直流电机的控制课程设计报告
  16. 学习Pycharm使用方法(一):Pycharm中Make available to all projects的含义是什么
  17. grep 正则表达式 sed awk expect
  18. Unity3D 避免玩家作弊
  19. 如何使用pdpipe与Pandas构建管道?
  20. 用execjs破解百度翻译sign

热门文章

  1. python代码大全表解释-.python3基础之“术语表(1)”
  2. 没有c语言基础可以学python吗-零基础学Python之前需要学c语言吗
  3. python 打开文件-Python 读文件
  4. 用python画关系网络图-python networkx 包绘制复杂网络关系图的实现
  5. python好学吗mooc中文网-Python学习第一课-MOOC嵩天
  6. linux下载哪个python版本-Linux下升级安装Python-3.6.2版本
  7. matlab求kcf算法响应图_剖析KCF
  8. lua学习笔记之io
  9. LeetCode Queue Reconstruction by Height(贪心)
  10. LeetCode Path Sum II(dfs或者bfs)