GDAL图像分割算法实现

ArcGIS 10.7基础:三种栅格影像裁剪操作 本次选择第二种分割方法,需要在下面的【输出栅格数】里选择宽度和高度,本次输入3和2,意思是整体分成宽为3个,高为2个的数据,换一种说法:水平方向上分割为3个,垂直方向上分割为2个。结果如下图所示:相当于矢量面数据和栅格数据重合的部分保留了下来,进一步理解【分割栅格】的第三种方法的含义。工具位于【栅格处理】下,顾名思义,【分割栅格】指的是将栅格数据按照需求分割为更小的部分。打开之后,加载设置,并进行如下设置,最好把下图所示的红色框内的设置也勾选一下。结果如下,与【分割栅格】的第三种方法结果一样。 阅读详情

一、图像分割在arcgis中叫做分割栅格,在工具箱里面打开,可以看到基本界面如下;arcgis提供了两种分割方法:按数量和按尺寸分割。

二、按数量分割是输入列和行,输出列*行个被分割的图像,同时还要保存原始图像的地理信息和投影信息。原始图像宽除以列得到输出图像的宽,原始图像高除以行得到输出图像的高,如果除不尽则向上取整,所以在边缘部分会有黑边。arcgis分幅方法是:从下往上、从左往右裁剪。本文从上往下、从左往右,能够正确处理黑边。

三、编译环境:VS2012+GDAL,需要自己配置gdal和修改文件路径,可以参考https://blog.youkuaiyun.com/HB_Programmer/article/details/81808963,分割算法是我自己所想,里面重点是分割算法的具体实现,针对不同格式的数据还需自己加入判断。

四、源代码

#include <iostream>
#include "gdal_priv.h"//包含头文件

using namespace std;
//声明函数
void CutByNumber(const char *pszSrcFile,//输入文件
                 const char *pszDstFile,//输出文件夹
                 int iStartX,int iStartY,//起始行列号row,col
                 int iSizeX,int iSizeY,//裁剪列数和行数imgWidth,imgHeight
                 const char *pszFormat,//输出文件格式
                 int x,int y);
//声明全局变量
int a=0;

int main()
{
	GDALAllRegister();//注册驱动
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");//支持中文路径

	GDALDataset  *poDataset;
	//请输入你的正确的路径
	string pszSrcFile = "D:/Desktop/1.png";
	poDataset = (GDALDataset *) GDALOpen( pszSrcFile.data(), GA_ReadOnly );
    if( poDataset == NULL )
    {
        cout<<"poDataset is NULL"<<endl;
        return 0;
    }
	//获取图像宽、高、波段数
	int width = poDataset->GetRasterXSize();
	int height = poDataset->GetRasterYSize();

	//起始行列号
    int row = 0;
    int col = 0;
	//裁剪个数
	int x,y;
	cout<<"输入裁剪列和行(以空格隔开):";
	cin>>x>>y;
    //裁剪大小
    int imgWidth = (ceil)(width/(float)x);
    int imgHeight = (ceil)(height/(float)y);
	
	//输出图像格式
    string type = ".png";
    //执行裁剪
    GDALRasterBand *poBand;
    string pszDstFile = "D:/Desktop/0";// D:/Desktop是输出文件夹 /0是输出图像的前缀
    string name2;
    int b = -1;
    for(int i=0;i<x*y;i++)
    {
        name2 = QString::number(i);
        pszDstFile = pszDstFile + name2.toLatin1() + type.toLatin1();

        row = imgWidth*(i%x);

        if(i%x == 0)
            b++;
        col = imgHeight*b;
        CutByNumber(pszSrcFile.data(),pszDstFile.data(),row,col,imgWidth,imgHeight,"GTiff",x,y);

        //输出统计信息
        GDALDataset *pDstDS = (GDALDataset*)GDALOpen(pszDstFile.data(),GA_ReadOnly);
        //生成均值和标准差
        double min,max,mean,stdDev;
        for(int i=1;i<=pDstDS->GetRasterCount();i++)
        {
            poBand = pDstDS->GetRasterBand(i);
            poBand->ComputeStatistics(FALSE,&min,&max,&mean,&stdDev,NULL,NULL);
        }
        //统计直方图
        unsigned long long panHistogram[256] = {0};
        for(int i=1;i<=pDstDS->GetRasterCount();i++)
        {
            poBand = pDstDS->GetRasterBand(i);
            poBand->GetHistogram(-0.5,255.5,256,panHistogram,TRUE,FALSE,NULL,NULL);
        }
        GDALClose((GDALDatasetH)pDstDS);
        pszDstFile = "D:/Desktop/0";
    }
}

//实现裁剪函数
void CutByNumber(const char *pszSrcFile,//输入文件
                 const char *pszDstFile,//输出文件夹
                 int iStartX,int iStartY,//起始行列号row,col
                 int iSizeX,int iSizeY,//裁剪列数和行数imgWidth,imgHeight
                 const char *pszFormat,//输出文件格式
                 int x,int y)
{
	GDALAllRegister();
    CPLSetConfigOption( "GDAL_FILENAME_IS_UTF8", "NO" );

    GDALDataset *pSrcDS = (GDALDataset*)GDALOpen(pszSrcFile,GA_ReadOnly);

    if(pSrcDS == NULL)
    {
        cout<<"Open Image failed! "<<endl;
        return ;
    }

    a++;

    //获取数据类型和波段信息
    GDALDataType dataType = pSrcDS->GetRasterBand(1)->GetRasterDataType();
    int iBandCount = pSrcDS->GetRasterCount();
    int width = pSrcDS->GetRasterXSize();
    int height = pSrcDS->GetRasterYSize();
    //裁剪后的图像宽高
    int iDstWidth = iSizeX;
    int iDstHeight = iSizeY;

    //计算裁剪后图像左上角坐标
    double adfGeoTransform[6] = {0};
    pSrcDS->GetGeoTransform(adfGeoTransform);
    adfGeoTransform[0] = adfGeoTransform[0] + iStartX*adfGeoTransform[1] + iStartY*adfGeoTransform[2];
    adfGeoTransform[3] = adfGeoTransform[3] + iStartX*adfGeoTransform[4] + iStartY*adfGeoTransform[5];

    //创建输出文件并设置空间参考和坐标信息
    GDALDriver *poDriver = (GDALDriver*)GDALGetDriverByName(pszFormat);
    GDALDataset *pDstDS = poDriver->Create(pszDstFile,iDstWidth,iDstHeight,iBandCount,dataType,NULL);
    pDstDS->SetGeoTransform(adfGeoTransform);
    pDstDS->SetProjection(pSrcDS->GetProjectionRef());

    int *pBandMap = new int[iBandCount];
    for(int i = 0;i < iBandCount;i++)
        pBandMap[i] = i + 1;

    //根据类型判断,申请不同类型的缓存
    if(dataType == GDT_Byte)//如果是8bit图像
    {
        unsigned char *pDataBuff = new unsigned char[iDstWidth*iDstHeight*iBandCount];

        //防止越界
        int val1 = 0;
        int val2 = 0;

        if(a%x == 0 && iDstWidth/(float)x != 0)
        {
            val1 = x*iDstWidth - width;
            iDstWidth = iDstWidth - val1;
        }

        if(a > x*(y-1) && iSizeY/(float)y != 0)
        {
            val2 = y*iDstHeight - height;
            iDstHeight -= val2;
        }
        //上部的黑边只能加在下面,改坐标系或者从左下角读取数据
        pSrcDS->RasterIO(GF_Read,iStartX,iStartY,iDstWidth,iDstHeight,pDataBuff,
                         iDstWidth,iDstHeight,dataType,iBandCount,pBandMap,0,0,0);

        pDstDS->RasterIO(GF_Write,0,0,iDstWidth,iDstHeight,pDataBuff,
                         iDstWidth,iDstHeight,dataType,iBandCount,pBandMap,0,0,0);

    }
    else
    {
        //其他类型的图像,与8bit类型,就是申请的缓存类型不同
    }

    delete[] pBandMap;
    GDALClose((GDALDatasetH)pSrcDS);
    GDALClose((GDALDatasetH)pDstDS);
}

 

利用Python+OpenCV与GDAL批量裁剪图像 图片批处理介绍:        由于在进行实验时,我们的图片没有resize到固定大小,或者想要将一个特别大的图片切分成若干个相同大小的自图片,常规做法是进来一张图,在算法预处理的环节就resize或者crop掉。这里,利用python+opencv进行了输入一个图片目录,然后对该目录下制定格式的图片按照指定大小进行裁剪输出;有的时候,我们接触到tif或者geotif图像,自己就带有地理坐标,如 阅读详情

相关推荐

利用Arcgis制作图像分割数据集

利用Arcgis制作图像分割数据集一,进行矢量化获取矢量数据 一,进行矢量化获取矢量数据   如果已经获取到了矢量数据,可直接跳过此步骤。由于本文是以制作用于进行遥感影像中农村道路提取的数据集无法从网络上获得矢量数据,所以自行获取矢量数据。直接在arcmap中进行矢量化,生成shp文件,由于本文矢量化后的shp文件是线文件,道路是面,直接进行缓冲区分析构建道路的面文件。 ...

qq_41417974的博客 9579

用gdal分割tif文件,保持分割后的小文件位置不变

遥感tif文件太大了(30G),想将他切分为多个小的分别进行处理,考虑道之后想要在重组的,但是看了一圈都没有说明切分后的位置问题,就边查边写了一个。先看看效果图 可以看到切分后再将所有小块tif文件导入Arcgis位置互相没有偏差,黑框应该是可以通过某种手段去除的,但目前还没有查到,评论区知道的说一下哦。 下面上代码,使用滑动窗口进行切分,重复率设为0.1. import os import gdal import numpy as np # print(np.__path__) # 读取tif数

god_roading的博客 3565

告别像素级折磨!用飞桨EISeg 0.4.0交互式分割,5分钟搞定遥感/医疗图像标注

本文介绍了飞桨EISeg 0.4.0交互式分割工具在遥感影像和医疗图像标注中的高效应用。通过智能化的点击-修正交互模式,EISeg显著提升了标注效率,将单张肝脏CT图像的标注时间从15-30分钟缩短至2-5分钟,同时保持高精度。文章还提供了从安装到实战的完整指南,帮助用户快速上手并优化标注流程。

weixin_40192258的博客 446

GIS技巧100例05-ArcGIS分割栅格(批量裁剪)

GIS思维于这一次要介绍的是《GIS技巧100例05-ArcGIS分割栅格(批量裁剪)》,我们之前介绍ArcGIS批量批量裁剪影像建议大家用的是模型构建器。今天我会介绍ArcGIS分割工具来快速的分割栅格,但是快是快但是没模型构建器那么个性化,智能化。 模型构建器,一次搭建,后续直接调用。 点击学习:ArcGIS之模型构建器(ModelBuilder)视频教程 我们回到正题,说下今天的介绍。主要是介绍这个工具的3个分割算法。 1、切割成每块指定大小,比如每个切..

GIS思维的博客 8557

使用C++_GDAL剪切大型tif图

使用C++_GDAL剪切大型tif图 全视野图像WSI都比较大,通常为10w×10w左右。为了能用他来训练算法需要将其剪切为瓦片(patch)。GDAL是google处理遥感卫星地图的一个工具,我用来试试剪切WSI。后来找到了python的openslide剪切WSI的方法,效果没GDAL好,或许是我的打开方式不对。 效果: C++_GDAL: 11w×8.5w像素、1.5G的图切成256*256大小,切出来有14w张左右,花了40几分钟,一共有20多G。 python_openslide: python_

weixin_46050479的博客 6738

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3902

图像分割——meanshift算法(C++&GDAL库)

图像分割——meanshift算法(C++&GDAL库) 一、meanshift分割原理 二、分割技术流程 三、代码实例 3.1 C++&GDAL库 实现 3.2 分割结果 3.3 结果分析

qq_42315165的博客 5537

适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)

yolov8源码下载地址:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLiteyolov8使用文档: Home - Ultralytics YOLOv8 Docs教学视频参考: 包会!YOLOv8训练自己的数据集_哔哩哔哩_bilibili先用conda prompt创建一个虚拟环境,我的叫yolov8, python版本用3.10 源码地址:GitHub - ul

CV在读 25万+

python gdal + skimage实现基于遥感影像的传统图像分割及合并外加矢量化

根据我前述博客中对图像传分割算法及图像块合并方法的实验探究,在此将这些方法用于遥感影像并尝试矢量化。 这个过程中我自己遇到了一个棘手的问题,在最后的结果那里有描述,希望知道的朋友帮忙解答一下,谢谢! 直接上代码: # -*- coding: utf-8 -*- import os import cv2 import gdal from osgeo import ogr,osr import num...

qq_20373723的博客 5430

【无标题】ReaxFF拟合参数以及算法安装

ReaxFF拟合参数以及算法安装

zmzyzm的博客 1418

告别虚拟机!用ZYNQ7000和PYNQ 2.6.0打造一个能实时识别人脸的“智能摄像头”

本文详细介绍了如何利用Xilinx ZYNQ7000开发板和PYNQ 2.6.0框架构建实时人脸识别系统。通过硬件加速和嵌入式开发技术,该系统实现了低延迟、低功耗的独立运行能力,适用于边缘计算和物联网应用。文章包含从环境搭建到核心功能实现的完整指南,并提供了性能优化和问题排查的实用技巧。

weixin_42543046的博客 390

从入门到精通:基于U-Net的多光谱图像分割实战全流程详解

掌握多光谱图像的U-Net分割技术,解决遥感、农业与环境监测中的精准分类难题。详解数据预处理、模型构建与训练全流程,突出高精度、强泛化优势。从入门到精通,实战步骤清晰,值得收藏。

LiteCode的博客 1069

手把手教你用Isaac Sim 8打造逼真光影效果:参数设置与场景应用

本文详细介绍了如何使用Isaac Sim 8打造逼真光影效果,涵盖基础参数设置、高级材质交互、专业级灯光造型技法以及复杂场景的灯光布局策略。通过实战案例和参数调优技巧,帮助用户提升虚拟场景的视觉表现,适用于数字孪生、虚拟仿真和影视特效等领域。

weixin_30836759的博客 78

MMSegmentation 图像分割框架入门指南:安装与运行详解

MMSegmentation 图像分割框架入门指南:安装与运行详解 【免费下载链接】mmsegmentation OpenMMLab Semantic Segmentation Toolbox and Benchmark. 项目地...

gitblog_00539的博客 547

Ubuntu 20.04 环境下Autoware.universe 与 Carla 0.9.13 联合仿真

安装内容: ROS Galactic Autoware.universe based on ROS Galactic Carla 0.9.13 UnrealEngine 4.26 Openplanner (additional files: op-bridge/op-agent/scenariorunner/map data)

mhl1107的博客 1798

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

利用ENVI处理TIF文件,把多个tif整合到一个完整的tif,例如2003-2011年的tif整合到一个tif上。

unique_sir的博客 1万+

OpenCV Java 距离变换的图像分割

package com.opencv; import java.util.ArrayList; import java.util.List; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; impor...

梦里蓝天 694

8.5华为OD机试真题 新系统 - IPv4 等长子网划分与自动分配系统 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - IPv4 等长子网划分与自动分配系统 (Java/Py/C/C++/Js/Go)

算法大师! 524

gdal 生成影像的统计信息(ComputeStatistics)

double tmpDou = -1; for (int i = 1; i <= dsout.RasterCount; i++) { dsout.GetRasterBand(i).ComputeStatistics(false, out tmpDou, out tmpDou, out tmpDou, out tmpDo

rrrrssss00的专栏 5380

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

python读取tif格式的遥感影像(灰度图)并用迭代法阈值选择算法进行二值化处理

在python中,一般的图像处理库或者绘图库无法处理或显示遥感影像,例如Matplotlib,opencv,scipy等等,用这些库读取遥感影像数值会发生一定的错误,从而导致后续工作无法展开。因此我们需要用到GDAL这个库。 GDAL的安装 GDAL轮子安装网址 找到与自己python相对应的版本即可 轮子安装完成后,在终端cd到轮子的安装位置,输入pip install “文件名” 这样就完成GDAL的安装了 批量读取遥感影像 import os from osgeo import gdal fil

YuqingF的博客 5179

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

磨染的初心——计算机视觉的现状(3.1):图像分割

磨染的初心——计算机视觉的现状(3.1):图像分割 为了通过材质、形状、结构识别目标,对图像进行分割应该是必然的选择。在这一点上计算机视觉研究者们算是勉强达成了共识,图像分割甚至被很多研究者列为计算机视觉的基本任务之一了。很多图像分割算法被提了出来,归纳起来可以分为基于阈值的方法、基于聚类的方法、基于区域的方法、基于图割的方法、活动边界模型和水平集、基于卷积神经网络的方法。 基于阈值的...

weixin_30414635的博客 369

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

分水岭算法详解1

分水岭算法是图像分割算法中十分重要的一种算法,由于其具有良好的边缘检测能力并且能够得到相对集中的集水盆的特点已经被广泛的应用于图像处理过程中。分水岭算法最早由Soille P于1992年提出,并被用于图像分割领域。然而分水岭算法在获取良好边缘的同时也面临着影像过分割的问题,因此有学者对此进行研究提出了多种分水岭分割方式,本文简单介绍一下最基本的分水岭分割方式。 分水岭算法基本思想: 一个灰度影像可...

qq_32790593的博客 3628

sdxxl编译与使用指南:以一个遥感大图像分割任务为例

这是中国地质大学(武汉)面向对象程序设计的一项期末作业。作为大一生,我记录下我的经验,供后人参考。作业要求选段:……二、教师提供的程序与数据的说明:(1)stxxl-1.4.1.tar.gz文件是基于外存的标准模板库源代码,能处理大于内存的大数据……三、实习内容:(1) 设计一个类似于STXXL中VECTOR 的动态数组的模板类HugeVector,能处理大于内存的数据。算法能利用内存和硬盘的容量为动态数组分配空间。

hhhxxxyyy3的博客 291

图像分割的关键

个人感觉主要从两方面看: 1.分割结果。天花乱坠,但结果不好,都是浮云,要经得起对比。 对于结果,当然需要设计算法,现在一般流行的是区域增长+区域合并; 区域增长面临着选种子点的问题,区域合并面临着局部最佳和全剧最佳的问题; 局部最佳又可以分为单项局部最佳和双向局部最佳问题,很多论文喜欢证明自己的双向局部最佳就是全局最佳,但表示只是文字说明,没有真相; 全剧最佳可以选用各种寻优算法,比如

boyhailong的专栏 1737

Java线程控制的图像分割与合成

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 592

从标注到部署:基于EISeg与PaddleSeg构建端到端图像分割应用

本文详细介绍了如何利用EISeg与PaddleSeg构建端到端图像分割应用,从智能标注到模型部署的全流程。EISeg作为交互式分割工具,显著提升标注效率,而PaddleSeg则提供强大的训练与部署能力,特别适合中小型团队和敏捷开发场景。文章还分享了实战技巧,包括环境配置、模型选择、标注效率提升及部署优化。

weixin_42625070的博客 360
上一篇: ENVI%2线性拉伸算法实现
下一篇: Qt中文路径乱码问题(MSVC编译器)
之乎者也哦
博客等级 码龄8年 7165粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值