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

全视野图像WSI都比较大,通常为10w×10w左右。为了能用他来训练算法需要将其剪切为瓦片(patch)。GDAL是google处理遥感卫星地图的一个工具,我用来试试剪切WSI。后来找到了python的openslide剪切WSI的方法,效果没GDAL好,或许是我的打开方式不对。

效果:

目的:将11w×8.5w像素、1.5G的tif图切成512*512大小,切出来应该有3.8w左右个patch。

C++_GDAL:

把WSI(patch文件夹与WSI在同一目录)放在不同盘处理的速度不同,经过尝试得到数据(初始patch生成速度和最后patch生成速度数值上等于patch文件夹中按patch修改日期排序的第二分钟的文件数量和倒数第二分钟的文件数量):

WSI及patch位置 初始patch生成速度 最后patch生成速度 全程用时
C盘 3552张/分钟 3919张/分钟 12分钟
D盘 3378张/分钟 2213张/分钟 17分钟
移动硬盘 2086张/分钟 505张/分钟 47分钟

切出来有19.8G,

上代码:
头文件:
GetMask.h

#pragma once
#include"gdal_priv.h"
#include <vector>
#include <string>
#include <iostream>
#include <io.h>
#include <direct.h>
using namespace std;void GetMask(const char* src, int N); //得到图片src的N×N处理后的mask
void SplitSrc(const string& s, vector<string>& v, const string& c); //s为绝对路径,v为拆分后依次放置所有文件夹和文件名的向量,c为拆分依据
void GetPatch(const char* src, int imgWidth, int imgHeight, int x, int y, int N, vector<string>& v); //从src图片x,y处开始切割得到N×N大小的patch

源文件:
main.cpp

#include"GetMask.h"int main() {const char* src = "H:\\52001488-3\\qiepian\\52001488-3.tif";  //切片路径if (_access(src, 0) == -1){cout << "该文件不存在!";return 0;}int N = 256;          //patch大小为N×NGetMask(src, N);return 0;
}

GetMask.cpp

#include "GetMask.h"
#include<iostream>void SplitSrc(const string& s, vector<string>& v, const string& c) //s为绝对路径,v为拆分后放置所有文件夹文件名的向量,c为拆分依据
{string::size_type pos1, pos2;pos2 = s.find(c);pos1 = 0;while (string::npos != pos2){v.push_back(s.substr(pos1, pos2 - pos1));pos1 = pos2 + c.size();pos2 = s.find(c, pos1);}if (pos1 != s.length())v.push_back(s.substr(pos1));
}void GetMask(const char* src, int N) {   //获取patchstring s = src;vector<string> v;string folderpath = "";SplitSrc(s, v, "\\"); //按"\\"分割,返回所在文件夹路径for (vector<string>::size_type i = 0; i != v.size() - 1; ++i) {folderpath = folderpath + v[i] + "\\";}folderpath = folderpath + "patch" + to_string(N);  //patch文件夹路径if (_access(folderpath.c_str(), 0) == -1)if (_mkdir(folderpath.c_str())); //在图片所在目录建立文件夹patch存放中间文件patchGDALAllRegister();  //注册文件格式CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");  //支持中文路径GDALDataset* pSrcDS = (GDALDataset*)GDALOpen(src, GA_ReadOnly);  //指向src图int imgWidth = pSrcDS->GetRasterXSize();   //图像宽度int imgHeight = pSrcDS->GetRasterYSize(); //图像高度int bandNum = pSrcDS->GetRasterCount();   //波段数int depth = GDALGetDataTypeSize(pSrcDS->GetRasterBand(1)->GetRasterDataType()) / 8; //图像深度int x = 0;  //patch离原图左边的距离int y = 0;  //patch离原图上边的距离int x_size = N, y_size = N; //patch的宽高string patch;//读取图片的一部分size_t space = (size_t)N * N * bandNum * depth;GByte* pDataBuff = new GByte[space];for (y = 0; y < imgHeight; y += N) {for (x = 0; x < imgWidth; x += N) {if (y + N <= imgHeight) {y_size = N;}else {y_size = imgHeight - y;}if (x + N <= imgWidth) {x_size = N;}else {x_size = imgWidth - x;}pSrcDS->RasterIO(GF_Read, x, y, x_size, y_size, pDataBuff, x_size, y_size, GDT_Byte, bandNum, nullptr, (size_t)bandNum * depth, (size_t)N * bandNum * depth, depth);//pSrcDS = nullptr;//创建新文件patch = folderpath + "\\" + to_string(x) + "-" + to_string(y) + ".tif";GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTIFF");char** ppszOptions = NULL;ppszOptions = CSLSetNameValue(ppszOptions, "COMPRESS", "LZW");    //配置图像信息GDALDataset* pDstDS = poDriver->Create(patch.c_str(), x_size, y_size, bandNum, GDT_Byte, ppszOptions);//写入文件pDstDS->RasterIO(GF_Write, 0, 0, x_size, y_size, pDataBuff, x_size, y_size, GDT_Byte, bandNum, nullptr, (size_t)bandNum * depth, (size_t)N * bandNum * depth, depth);GDALClose(pDstDS);}}GDALClose(pSrcDS);delete[] pDataBuff;pDataBuff = nullptr;
};

python_openslide:

python_openslide效果及代码

点个赞再走~~~~~~~~~

使用C++_GDAL剪切大型tif图相关推荐

  1. 使用python_openslide剪切大型tif图

    使用python_openslide剪切大型tif图 全视野图像WSI都比较大,通常为10w×10w左右.为了能用他来训练算法需要将其剪切为瓦片(patch).之前用GDAL切但是切的很慢.找了好久终 ...

  2. osgearth处理大型tif文件,切割成tms瓦片文件,本地发布

    问题描述: osgearth加载小型的tif文件速度较快,面对大型tif文件的时,要等待较长的加载时间,甚至无法加载. 解决方法: 利用osgearth中自带的osgearth_package程序处理 ...

  3. 樊振东拟保送上海交大!评论区变大型P图现场

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文来源:南方都市报.中国青年报综合自国家体育总局科教司.上海交通大 ...

  4. arcmap点图层获取tif图像素值,ArcMap中输出tif图片时的Write GeoTIFF Tags选项,Engine中如何实现?...

    private bool NewExport(IActiveView activeView, string pathFileName, int pOutDPI) { if (activeView == ...

  5. 基于Python(Arcpy)批量对遥感影像MK与SEN检验,结果为两张TIF图(MK与SEN)

    def mkSen_cal(source_folder,outpt_folder):arcpy.CheckOutExtension("spatial")arcpy.env.work ...

  6. 分布式图数据库在贝壳的应用实践

    导读:你想知道百亿级图谱如何实现毫秒级查询吗?社区众多的图数据库中如何才能挑选到一款适合实际应用场景的图数据库呢?贝壳找房的行业图谱480亿量级的三元组究竟是如何存储的呢?本文将带你探索上述问题并从中 ...

  7. GNN与Transformer融合促进药物发现 | 2022几何图机器学习展望

    导读:几何机器学习和基于图的机器学习是当前最热门的研究课题之一.在过去的一年中,该领域的研究发展迅猛.在本文中,几何深度学习先驱 Michael Bronstein 和 Petar Veličkovi ...

  8. MindManager脑图之项目管理甘特图

    MindManager脑图软件曾有个很受欢迎的第三方插件JCVGantt Pro 3.它用以扩充MM的功能,实现项目管理安排,以及制作项目甘特图.在MM8.9等以后的版本中,MM自带了项目管理功能,可 ...

  9. [转]基于图的机器学习技术:谷歌众多产品和服务背后的智能

    近来机器学习领域实现了很多重大的进展,这些进展让计算机系统具备了解决复杂的真实世界问题的能力.其中,谷歌的机器学习又是怎样的 ? 近来机器学习领域实现了很多重大的进展,这些进展让计算机系统具备了解决复 ...

最新文章

  1. poj 2362 Square
  2. Maven学习总结(一)——Maven入门
  3. JavaScript异步史
  4. ZigBee On Windows Mobile—利用CF卡接口外扩
  5. hadoop上传文件java_hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统...
  6. 【Clickhouse】Clickhouse 表引擎之 Log系列
  7. bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声(单调栈)
  8. 未解决:运行EtherCalc出错:Error: Cannot find module 'zappajs'
  9. php hr系统,专业hr管理系统
  10. 如何在IOS上玩gba游戏(免越狱)
  11. Js常用40个页面效果
  12. IEtester 中文官方网站 raquo; IETester 最新版下载 V0.4.6 支持WIN7 支持IE9 马上下载
  13. GPU阵列 安特卫普大学展示桌面超级计算机Fastra II
  14. html在图片上半透明磨砂,有没有办法在HTML内容上实现磨砂玻璃浮动div(类IO7)...
  15. 5GNR漫谈8:CSI-RS/TRS/SRS参考信号
  16. 汇编语言实现I/O地址译码实验
  17. 安装和卸载.deb包
  18. 网络安全一哥的流量分析服务非常好
  19. switch模式的切换
  20. 【电气专业知识问答】问:高压断路器大修后运行人员需了解哪些试验工作及结论?

热门文章

  1. 慕课网SSMOA办公系统
  2. Zed Shaw:一位老程序员的建议
  3. 记录一次基于PyQt5的标准铂电阻温度计分度表制作界面设计
  4. 2020ACM俱乐部后备营个人训练赛第七、八、九场
  5. 页面展示结果不符合预期
  6. java毕业设计——基于java+J2EE+sqlserver的在线考试系统设计与实现(毕业论文+程序源码)——在线考试系统
  7. 合工大c语言课后作业,填空类 合工大C语言题库
  8. 中专毕业生计算机简历模板,中专生简历模板
  9. 计算机工程实践 课程大纲,《计算机专业》实习教学大纲.doc
  10. FAQ:Docker和K8s部署常见问题汇总(持续更新)