(Python)使用Gdal+opencv读遥感影像加简单处理

2023-05-16

文章目录

  • 简介
  • 代码
  • 运行结果

简介

使用Python API的gdal和opencv一般遇到最大的问题就是,遥感影像一般为16位和opencv只处理8位,中间的转换有很多的写的非常复杂又不完全对的,本文提供一个可用的例子,用于读取影像截取ROI,这样就可以很方便的使用opencv算法进行图像处理了,以此作为自己的记录和初学者参考。

使用库的相关版本
python 3.9
gdal 3.2.3
opencv 4.5(可使用PLI或者matplot)

代码

from osgeo import gdal
import numpy as np
import cv2
from time import *
def readTIFF(tifpath, bandnum):
    """
    Use GDAL to read data and transform them into arrays.
    :param tifpath:tif文件的路径
    :param bandnum:需要读取的波段
    :return:该波段的数据,narray格式。len(narray)是行数,len(narray[0])列数
    """
    image = gdal.Open(tifpath)  # 打开影像
    if image == None:
        print(tifpath + "该tif不能打开!")
        return
    im_width = image.RasterXSize  # 栅格矩阵的列数,经度方向,cols(好多人搞反)
    im_height = image.RasterYSize  # 栅格矩阵的行数,纬度方向,rows
    im_bands = image.RasterCount  # 波段数
    im_proj = image.GetProjection()  # 获取投影信息坐标系
    im_geotrans = image.GetGeoTransform()  # 仿射矩阵,具体参考GetGeoTransform
    print('tif数据:{}个行,{}个列,{}层波段, 取出第{}层.'.format(im_width, im_height, im_bands, bandnum))
    im_data = image.ReadAsArray(0, 0,  im_width, im_height)
    del image  # 减少冗余
    return im_data,im_proj, im_geotrans
def normalization(data):
    _range = np.max(data) - np.min(data)
    return (data - np.min(data)) / _range
def Tiff16to8bit(img_16):
    if (np.max(img_16) - np.min(img_16) != 0):
        # img_nrm = (img_16 - np.min(img_16)) / (np.max(img_16) - np.min(img_16)) #计算灰度范围,归一化
        img_nrm = normalization(img_16)
        img_8 = np.uint8(255 * img_nrm)
    return img_8
begin_time = time()
#读入图片
im_data,im_proj, im_geotrans = readTIFF("D:\\SongshanZY3\\ortho\\BWDSC.tif",0)
#取小块的左上角坐标
x_offset,y_offset = 5000,6000
#小块大小
block_size_x = 1000
block_size_y = 2000
#注意矩阵访问和直接的坐标系是相反的,这个在C++的at<double>(y,x)也有体现
block_im = im_data[y_offset:y_offset + block_size_y,x_offset:x_offset + block_size_x]
block_im = Tiff16to8bit(block_im)
end_time = time()
run_time = end_time-begin_time
print ('该程序运行时间:',run_time,'s') #该循环程序运行时间: 1.4201874732
#展示并存储
cv2.imwrite("block_B.png",block_im)
cv2.namedWindow("block",0)#创建可以缩放大小的窗口
cv2.imshow("block",block_im)

#进行一些opencv的测试使用
#canny边缘提取
block_im = cv2.GaussianBlur(block_im, (3, 3), 0)
canny = cv2.Canny(block_im, 30, 120)
cv2.namedWindow("Canny",0)#创建可以缩放大小的窗口
cv2.imshow('Canny', canny)

#hough直线检测
hough_img = block_im.copy()
lines = cv2.HoughLinesP(canny,1,np.pi/180,30,minLineLength=60,maxLineGap=10)
lines1 = lines[:,0,:]#提取为二维
for x1,y1,x2,y2 in lines1[:]:
    cv2.line(hough_img,(x1,y1),(x2,y2),(255,0,0),1)
cv2.namedWindow("Hough",0)#创建可以缩放大小的窗口
cv2.imshow("Hough", hough_img)

#otsu阈值分割
ret2, otsu = cv2.threshold(block_im, 0 , 255, cv2.THRESH_OTSU)
cv2.namedWindow("Otsu",0)#创建可以缩放大小的窗口
cv2.imshow("Otsu", otsu)

cv2.waitKey()

运行结果

可以看到30000*20000的图在笔者的thinkpadX1上时间基本1s左右,速度尚可;python的gdal比C++写起来方便多了,但是接口没那么全。
而且可以看到Opencv可以快乐的使用起来了,希望为初学者带来一些参考,后续继续补充。如需交流,个人微信WHUwsd1995.
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(Python)使用Gdal+opencv读遥感影像加简单处理 的相关文章

随机推荐

  • PX4飞控问题之参数重置问题

    PX4在上电的时候会出现参数重置的问题 xff0c 出现这个问题的机率很小 xff0c 可能上电几千甚至上万次才会出现一次重置的情况 xff0c 但一旦出现了参数重置 xff0c 飞机就无法飞行 xff0c 得重新校准传感器 要解决这个问题
  • STM32硬件基础--LTDC显示图像

    STM32硬件基础 LTDC显示图像 海东青电子 2019 11 13 23 40 05字数 2 635阅读 3 102 海东青电子原创文章 xff0c 转载请注明出处 xff1a https www jianshu com p 21638
  • PX4轨迹生成公式推导

    PX4轨迹生成公式推导下载链接 对于多旋翼 飞行任务的时候 通过地面站画出航点 上传给飞控 飞控通过轨迹生成算法生成平滑的目标位置 速度及加速度 给位置控制模块控制飞机的位置 速度及加速度 PX4轨迹生成的方法为 约束加加速度的S型速度曲线
  • 植保无人机航线规划

    最近折腾了植保无人机航线规划的算法 支持任意多边形 不包括自相交多边形 的边界及障碍区域 其中涉及到了多边形内缩外扩 多边形的分解 多边形交集 并集 差集 深度优先搜索 最短路径算法 耗时两个多月 用C 实现整套算法 生成的库在missio
  • 现代控制工程笔记(一)控制系统的状态空间描述

    文章目录 1 基本概念2 系统的状态空间描述状态空间描述框图状态变量选取的非唯一性 3 由系统微分方程列写状态空间表达式一 微分方程中不包含输入函数的导数项相变量法其他方法 xff1a 二 微分方程中包含输入函数的导数项 4 由传递函数列写
  • 百度Apollo 2.0 车辆控制算法之LQR控制算法解读

    百度Apollo 2 0 车辆控制算法之LQR控制算法解读 Apollo 中横向控制的LQR控制算法在Latcontroller cc 中实现 根据车辆的二自由度动力学模型 1 根据魔术公式在小角度偏角的情况下有 轮胎的侧向力与轮胎的偏离角
  • 多传感器融合--MATLAB跟踪器介绍

    多传感器融合 MATLAB跟踪器介绍 MATLAB通过多目标跟踪器可以融合多传感器检测到的目标信息 xff0c 常用到的多目标跟踪器有trackerGNN trackerJPDA trackerTOMHT trackerPHD等 track
  • MATLAB多传感器融合--核心步骤

    MATLAB多传感器融合 核心步骤 MATLAB的多传感器融合的核心步骤在stepImpl函数中实现 xff0c 该函数的输入的跟踪目标和测量的目标的信息 xff0c 输出为证实的真目标信息和处于试探的跟踪目标信息 confirmedTra
  • [新手编译内核]kernel进行编译时提示No rule to make target `menconfig'.

    windows下下载了 linux 2 6 37内核源码 xff0c 拷贝到U盘上 xff0c 通过mount挂载到了虚拟机里的Centos 5 5系统上 通过putty使用host only方式连接到虚拟机 xff0c 进行操作 在 mn
  • 协议和协议栈的区别?

    在通信领域特别是无线通信领域 xff0c 我们经常会听到用到什么协议啊 xff0c 什么协议栈方面的东西 1 首先 xff0c 协议定义的是一些列的通信标注 xff0c 通信的双方需要共同按照这一个标准进行正常的数据收发 xff1b 在计算
  • linux-kernel, bus总线数据结构分析

    设备模型中的三大组件是 xff1a 总线 xff0c 驱动 xff0c 设备 bus driver device 数据结构总览 总线除了一些物理总线的抽象 xff0c 还代表一些虚拟的总线 xff0c 如platform xff0c 所以在
  • JavaScript 猜数字小游戏

    说明 单独创建一个js文件 然后在文件里面写入下列代码 之后在html页面引入该js文件即可 span class token comment 设计并实现 猜数游戏 xff0c 并输出每轮猜数游戏的猜测次数 游戏规则如下 xff1a spa
  • 纯干货:LCD屏和OLED屏的区别?手机屏幕材质各有什么区别?

    纯干货 xff1a LCD屏和OLED屏的区别 xff1f 手机屏幕材质各有什么区别 xff1f 慢慢买比价 已认证的官方帐号 74 人赞同了该文章 今天我就为大家带来一篇纯干货知识点整理 xff0c 关于手机屏幕那点事看完秒懂 以及大家对
  • OpenJDK在OpenHarmony上异常问题分析

    目录 0 前言1 问题日志打印2 报错日志代码分析3 问题解决方案 0 前言 基于OpenHarmony的2022 06 30 master之前版本OpenJDK测试OK xff0c 但是之后版本测试报异常错误 1 问题日志打印 2 报错日
  • vnc viewer远程连接xfce桌面无法打开terminal终端

    这是因为默认的terminal错啦 xff0c 改一下就好 在页面左上角上找到 Appication gt Settings gt Settings Manager gt Preferred Applications gt Utilitie
  • ucosii第一章读书笔记

    第一章 嵌入式操作系统 1 1 计算机操作系统 简介 xff1a 嵌入式操作系统属于操作系统的一种 嵌入式操作系统的概念 xff1a 应用于嵌入式系统的操作系统叫做嵌入式操作系统 操作系统的概念 xff1a 是一种系统软件 作用于硬件和应用
  • ceres中的loss函数实现探查,包括Huber,Cauchy,Tolerant图像实现及源码

    ceres中的loss函数实现探查 xff0c 包括Huber xff0c Cauchy xff0c Tolerant图像实现及源码 各个损失函数的趋势图 xff1a Ceres内嵌的loss functions原理 xff1a 以Cauc
  • 使用自己的INDEMIND相机来运行ORBSLAM2单目,双目和深度模式(小觅相机和realsense通用)

    流程一览 配置ROSROS环境准备 以 xff11 6 04 ROS Kinetic为例 创建自己的工作空间 配置ORBSLAM编译ORBSLAM2 ROS常见错误及解决运行build ros sh时出现问题一 运行build ros sh
  • 超详细中文车牌识别开源库EasyPR入门实战(win10_VS2019_opencv34)

    中文车牌识别库EasyPR配置全过程及编译问题解决 xff08 win10 VS2019 opencv34 xff09 本文目录 中文车牌识别库EasyPR配置全过程及编译问题解决 xff08 win10 VS2019 opencv34 x
  • (Python)使用Gdal+opencv读遥感影像加简单处理

    文章目录 简介代码运行结果 简介 使用Python API的gdal和opencv一般遇到最大的问题就是 xff0c 遥感影像一般为16位和opencv只处理8位 xff0c 中间的转换有很多的写的非常复杂又不完全对的 xff0c 本文提供