数字图像处理之BSQ,BIL,BIP的存储格式相互转换算法,用Java+GDAL实现,附源码
GDAL如何配置在IDEA中自行百度
环境:IDEA2021.2.3+jdk11.0.1+GDAL(release-1928-x64-gdal-3-5-2-mapserver-8-0-0)
1.首先来了解一下BSQ,BIL,BIP格式的定义(插图来源于@CSDN溯水xiangling)
(1)BSQ (band sequential):像素按波段顺序存储,先保存第一个波段,保存完毕后再保存第二个波段,以此类推。
(2)BIL(band interleaved by line format):像素按行存储,先保存第一个波段的第一行,再保存第二个波段的第一行,以此类推。
(3)BIP(band interleaved by pixel format):按像元顺序存储,先保存第一个波段的第一个像元,再保存第二个波段的第一个像元,以此类推。
2.编程实现:
(1)环境:IDEA2021.2.3+jdk11.0.1+GDAL(release-1928-x64-gdal-3-5-2-mapserver-8-0-0)
(2)在IDEA里如何配置GDAL自行百度
(3)实现:
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;/*** @Author: jue_chen* @Date: 2022/10/16/ 19:56* @Attention: 转载, 引用请注明出处*/public class CalculateBands {int iXSize; //图像的列数int iYSize; //图像的行数int bandsNum; //图像的波段数int[][][] bandArr; //存储图像的所有灰度值,BSQ格式//获取一副图像的波段信息public void getBands(String srcPath) {gdal.AllRegister(); //支持所有驱动//以只读方式读取数据存入Dataset类型里Dataset dataset = gdal.Open(srcPath, gdalconstConstants.GA_ReadOnly); //判断文件是否读取成功if (dataset == null) {System.out.println("文件读取失败");System.out.println(gdal.GetLastErrorMsg());System.exit(1);}iXSize = dataset.getRasterXSize(); //获取图像列数iYSize = dataset.getRasterYSize(); //获取图像行数bandsNum = dataset.GetRasterCount(); //获取图像波段数//定义波段类型的数组存放每一波段的信息Band[] band = new Band[bandsNum];for (int i = 0; i < bandsNum; i++) {band[i] = dataset.GetRasterBand(i + 1); //图像波段的索引值从1开始,不是0}//三维数组存放具体波段的灰度值,第一维存放波段数,第二维存放波段的行数,第三维存放波段的列数,以BSQ格式存储bandArr = new int[bandsNum][iYSize][iXSize];for (int i = 0; i < bandsNum; i++) {System.out.println("第" + (i + 1) + "波段");for (int j = 0; j < bandArr[0].length; j++) {band[i].ReadRaster(0, j, iXSize, 1, bandArr[i][j]); //一次读取一行灰度值数据//读取结果输出测试for (int k = 0; k < bandArr[0][0].length; k++) {System.out.print(bandArr[i][j][k] + "\t");}System.out.println();}System.out.println();}System.out.println();}//打印图像所有波段的灰度值public void printBandArr(int[][][] bandArr) {for (int i = 0; i < bandArr.length; i++) {for (int j = 0; j < bandArr[0].length; j++) {for (int k = 0; k < bandArr[0][0].length; k++) {System.out.print(bandArr[i][j][k] + "\t");}System.out.println();}System.out.println();}}//获得BSQ格式的数组public int[][][] getBSQ() {return bandArr;}//BSQ转BILpublic int[][][] BSQtoBIL(int[][][] bandArrBSQ) {//第一维存放波段的行数,第二维存放波段数,第三维存放波段的列数int[][][] bandArrBIL = new int[bandArrBSQ[0].length][bandArrBSQ.length][bandArrBSQ[0][0].length];for (int i = 0; i < bandArrBSQ[0].length; i++) { //BSQ的第二维大小for (int j = 0; j < bandArrBSQ.length; j++) { //BSQ的第一维大小for (int k = 0; k < bandArrBSQ[0][0].length; k++) { //BSQ的第三维大小bandArrBIL[i][j][k] = bandArrBSQ[j][i][k];}}}return bandArrBIL;}//BSQ转BIPpublic int[][][] BSQtoBIP(int[][][] bandArrBSQ) {//第一维存放波段的行数,第二维存放波段的列数,第三维存放波段数int[][][] bansArrBIP = new int[bandArrBSQ[0].length][bandArrBSQ[0][0].length][bandArrBSQ.length];for (int i = 0; i < bandArrBSQ[0].length; i++) { //BSQ第二维大小for (int j = 0; j < bandArrBSQ[0][0].length; j++) { //BSQ第三维大小for (int k = 0; k < bandArrBSQ.length; k++) { //BSQ第一维大小bansArrBIP[i][j][k] = bandArrBSQ[k][i][j];}}}return bansArrBIP;}//BIL转BSQpublic int[][][] BILtoBSQ(int[][][] bandArrBIL) {//第一维存放波段数,第二维存放波段行数,第三维存放波段列数int[][][] bandArrBSQ = new int[bandArrBIL[0].length][bandArrBIL.length][bandArrBIL[0][0].length];for (int i = 0; i < bandArrBIL[0].length; i++) { //BIL第二维大小for (int j = 0; j < bandArrBIL.length; j++) { //BIL第一维大小for (int k = 0; k < bandArrBIL[0][0].length; k++) { //BIL第三维大小bandArrBSQ[i][j][k] = bandArrBIL[j][i][k];}}}return bandArrBSQ;}//BIL转BIPpublic int[][][] BILtoBIP(int[][][] bandArrBIL) {//第一维存放波段的行数,第二维存放波段的列数,第三维存放波段数int[][][] bandArrBIP = new int[bandArrBIL.length][bandArrBIL[0][0].length][bandArrBIL[0].length];for (int i = 0; i < bandArrBIL.length; i++) { //BIL第一维大小for (int j = 0; j < bandArrBIL[0][0].length; j++) { //BIL第三维大小for (int k = 0; k < bandArrBIL[0].length; k++) { //BIL第二维大小bandArrBIP[i][j][k] = bandArrBIL[i][k][j];}}}return bandArrBIP;}//BIP转BSQpublic int[][][] BIPtoBSQ(int[][][] bandArrBIP) {//第一维存放波段数,第二维存放波段行数,第三维存放波段列数int[][][] bandArrBSQ = new int[bandArrBIP[0][0].length][bandArrBIP.length][bandArrBIP[0].length];for (int i = 0; i < bandArrBIP[0][0].length; i++) { //BIP第三维大小for (int j = 0; j < bandArrBIP.length; j++) { //BIP第一维大小for (int k = 0; k < bandArrBIP[0].length; k++) { //BIP第二维大小bandArrBSQ[i][j][k] = bandArrBIP[j][k][i];}}}return bandArrBSQ;}//BIP转BILpublic int[][][] BIPtoBIL(int[][][] bandArrBIP) {//第一维存放波段的行数,第二维存放波段数,第三维存放波段的列数int[][][] bandArrBIL = new int[bandArrBIP.length][bandArrBIP[0][0].length][bandArrBIP[0].length];for (int i = 0; i < bandArrBIP.length; i++) { //BIP第一维大小for (int j = 0; j < bandArrBIP[0][0].length; j++) { //BIP第三维大小for (int k = 0; k < bandArrBIP[0].length; k++) { //BIP第二维大小bandArrBIL[i][j][k] = bandArrBIP[i][k][j];}}}return bandArrBIL;}public static void main(String[] args) throws Exception {CalculateBands img = new CalculateBands();img.getBands("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\img\\9.png"); //读入图像int img_rows = img.iYSize; //图像灰度值的行数int img_cols = img.iXSize; //图像灰度值的列数int img_bandNum = img.bandsNum; //图像的波段数System.out.println("读入图像每一波段的灰度值行数为:" + img_rows);System.out.println("读入图像每一波段的灰度值列数为:" + img_cols);System.out.println("读入图像的波段数为:" + img_bandNum);System.out.println();int[][][] img_bandArrBSQ = img.getBSQ(); //获取以BSQ格式的存储的数组//BSQ转为BILint[][][] img_bandArrBIL = img.BSQtoBIL(img_bandArrBSQ);System.out.println("BIL的存储格式");img.printBandArr(img_bandArrBIL);//BSQ转为BIPint[][][] img_bandArrBIP = img.BSQtoBIP(img_bandArrBSQ);System.out.println("BIP的存储格式");img.printBandArr(img_bandArrBIP);//BIL转为BSQint[][][] img_bandArrBSQ_1 = img.BILtoBSQ(img_bandArrBIL);System.out.println("BSQ的存储格式");img.printBandArr(img_bandArrBSQ_1);//BIL转为BIPint[][][] img_bandArrBIP_1 = img.BILtoBIP(img_bandArrBIL);System.out.println("BIP的存储格式");img.printBandArr(img_bandArrBIP_1);//BIP转为BSQint[][][] imgBandArrBSQ_2 = img.BIPtoBSQ(img_bandArrBIP);System.out.println("BSQ的存储格式");img.printBandArr(imgBandArrBSQ_2);//BIP转为BILint[][][] imgBandArrBIL_2 = img.BIPtoBIL(img_bandArrBIP);System.out.println("BIL的存储格式");img.printBandArr(imgBandArrBIL_2);}
}
(4)结果:仅展示BSQ转BIL,BIP的测试结果
①图像的元数据
②读取为BSQ格式的存储格式
②BSQ转BIL
③BSQ转BIP
数字图像处理之BSQ,BIL,BIP的存储格式相互转换算法,用Java+GDAL实现,附源码相关推荐
- 遥感图像存储格式BSQ/BIL/BIP的理解
遥感图像存储格式BSQ/BIL/BIP的理解 BSQ(波段顺序格式) BIL(波段按行交叉格式) BIP(波段按像元交叉格式) BSQ(band sequential format)是按波段保存,也就 ...
- 数字图像处理领域的二十四个典型算法及vc实现、第一章
数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July 二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...
- 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF
数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF 一.概述 参考:特征点匹配+特征检测方法汇总 ORB的全称是Oriented ...
- 数字图像处理领域的二十四个典型算法
数字图像处理领域的二十四个典型算法及vc实现.第一章 一.256色转灰度图 二.Walsh变换 三.二值化变换 四.阈值变换 五.傅立叶变换 六.离散余弦变换 数字图像处理领域的二十四个典型算法及vc ...
- 基于FPGA数字时钟的设计(附源码)
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注"FPGA技术江湖"微信公众号,在"闯荡江湖"."行侠仗义"栏里获取其 ...
- 4个数字计算24点java算法(附源码)
今天看到一个帖子说程序员面试考24点算法,想为什么不用程序来实现呢.在网上没有找到非常完美的算法,包括那个24点计算器,给出的结果重复的也较多.所以自己写了一个.在这儿贴出来给大家分享一下.附源码. ...
- (附源码)python数字图像处理课程平台 毕业设计 242339
Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...
- (附源码)Python数字图像处理课程平台 毕业设计242339
Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...
- pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)
学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4239字,预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型,然后在Windows平台用C++ OpenCV D ...
最新文章
- 火爆国外的一份PyCharm快捷键和Python代码速查表
- 工业机器人 答案 韩建海_中国将连续8年成为工业机器人第一大市场,还将持续多久?...
- memoryTraining记忆训练小游戏
- IT运维面试问题总结-运维工具、开源应用(Ansible、Ceph、Docker、Apache、Nginx等)
- drupal 多语言_小小的开源机器人,Drupal的创造者,应对我们不断变化的经济,以及更多
- 河南理工大学计算机学院课表,河南理工大学实验课课程表.doc
- 翻译:如何在Mac OS X中设置文件权限chmod
- Windows注册表内容详解
- 王之泰201771010131《面向对象程序设计(java)》第二周学习总结
- OpenBmc开发13:添加传感器(fan)
- 大学计算机课程实验指导书,《大学计算机基础》课程实验指导书.doc
- AI赋能智慧图书馆,能否出现真正的书天堂?
- 它拖慢你的网速,还泄露你的个人隐私,学一招治治它
- Python turtle画玫瑰
- 中文用户输入纠错 综述
- win7升级win10方法
- 整顿职场,从 ROC 曲线开始
- ILSVRC2015数据集百度云下载链接
- AspectJ in Action 第2版 中文目录
- 点心发布新版安卓优化大师
热门文章
- cmake错误集锦:unkown arguments specified
- 微信小程序图书馆座位预约系统设计与实现 毕业设计论文 课题题目参考(1)功能需求、界面修购
- 安装Tomcat详细步骤
- 【tips】ORM - SQLAlchemy操作MySQL数据库
- 关于直播,所有的技术细节
- 氢原子角向概率密度分布matlab,求氢原子角向概率密度.PPT
- 为什么说当下重仓IPFS/FIL才是关键
- 【AI数学原理】概率机器学习(四):半朴素贝叶斯之TAN算法实例
- 流程控制语句break continu return 及方法(函数)
- 2017ife_yaoyao学院_task1