小编最近没事情干研究了一下之前学习的java,打开似曾相识的idea,想到之前老师叫我们实现的一个编程作业,读取遥感波段图像的特征值(最值、中值、众数、平均值、标准差之类的)。众所周知,遥感波段数据就是一个二维数组,里面存储的是每一个像元的DN值(灰度值也叫像元值),读取图像的特征值就是统计这些DN值的特征值。
为了让运算量少一点,小编提取了Landsat5 TM数据的3波段和4波段的一个矩形栅格,像元数量是64*30,那么最棘手的问题就是怎么将这些像元值读取到一个数组里面,我们想到使用arcmap里面的【转换工具】|【从栅格转出】|【栅格转Ascll】,其中3波段的ASCLL码文件如下图所示:
我们主要的操作对象是第7行开始的这32*15个整数,具体代码如下所示:
package 实习;
import java.io.*;
import java.lang.annotation.ElementType;
import java.nio.charset.Charset;
import java.time.temporal.Temporal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class 读取遥感图像 {
public static void main(String[] args) throws IOException {//创建一个文件对象
int[] a = 读入像元值(new File("D:\\桌面\\3波段.txt"));//存放波段3的ASCLL码值路径
int[] b = 读入像元值(new File("D:\\桌面\\4波段.txt"));//存放波段4的ASCLL码值路径
int[] C = 复制数组(a);
int[] D = 复制数组(b);
NDVI(C, D, new File("D:\\桌面\\4波段.txt"));
double[] A = 统计特征值(a, "D:\\桌面\\3波段.txt");//对数组a进行的计算,并且传回了平均数和标准差
double[] B = 统计特征值(b, "D:\\桌面\\4波段.txt");//对数组b进行了计算并且传回了平均数和标准差
多波段图像统计(C, D, A, B);
}
public static int[] 复制数组(int[] a) {
int[] C = new int[a.length];
for (int i = 0; i < a.length; i++) {
C[i] = a[i];
}
return C;
}
static int w = 0;//用来控制是否追加字符用的
public static int[] 读入像元值(File q) throws IOException {
BufferedReader b = new BufferedReader(new FileReader(q));
StringBuffer buffer = new StringBuffer();//Stringbuffer是动态字符串数组,可以放很多字符串
String value;
int a = -7;//统计行数
do {
value = b.readLine();//循环一次就保存一行字符串(代表着一行像元值)
a++;//保存栅格的行数
if (a >= 0 && value != null)//第7行开始读取
buffer.append(value);//append()是往动态字符串添加新的字符串,每循环一次存一行,两行之间有空格
} while (value != null);
String[] temp = buffer.toString().split(" ");
int[] number = new int[temp.length]; //temp里面的N个字符串代表所有的像元值
if (w == 0) {
FileWriter writer = new FileWriter("D:\\桌面\\遥感图像统计值.txt");//第一次写出直接清空之前的文件内容
writer.write(q + "有" + a + "行," + temp.length / a + "列像元,一共" + temp.length + "个像元。" + "\n");
writer.close();
} else {
FileWriter writer = new FileWriter("D:\\桌面\\遥感图像统计值.txt", true);//第二次写出则追加到之前的文本
writer.write(q + "有" + a + "行," + temp.length / a + "列像元,一共" + temp.length + "个像元。" + "\n");
writer.close();
}
w++;//控制是否是第一次输入
for (int i = 0; i < temp.length; i++) {
if (Integer.parseInt(temp[i]) >= 0)
number[i] = Integer.parseInt(temp[i]);//字符串数组转换成整数数组
// if (i % ((temp.length / a)) == 0)
// System.out.print("\n" + "第" + (i / (temp.length / a) + 1) + "行:");
// System.out.print(number[i] + " ");
}
return number;
}
public static double[] 统计特征值(int[] b, String a) throws IOException {
int e;//计算中位数用的
int k = b.length;//所有大于0的像元个数
int t = 0;//用于辅助比较各个像元值出现的次数
int s = 0;//存放出现次数最多的像元值(众数)
int sum = 0;//统计所有享元年值总和
for (int i = 0; i < b.length; i++) {//这里将值为-9999都筛选掉了
sum += b[i];
}
for (int i = 0; i < k; i++) {//比较n-1次就够了
for (int j = 0; j < k - 1; j++) {//每一个数的比较都比上一次少一次
if (b[j] > b[j + 1]) {//如果前面一个比后面一个大,那么大的都往后退
int temp = b[j];
b[j] = b[j + 1];
b[j + 1] = temp;//大的值都给了后面
}
}
}
int[] y = new int[(b[k - 1]) + 1];//存放出现的灰度级
int[] m = new int[(b[k - 1]) + 1];//存放各个灰度级出现的次数
FileWriter writer = new FileWriter("D:\\桌面\\遥感图像统计值.txt", true);
double[] f = new double[2];
f[0] = sum / k;//将平均值保存到浮点数组中
writer.write("\n" + a + "该遥感图像DN值最大为:" + b[k - 1] + ",最小为:" + b[0] + ",平均数是:" + f[0] + "\n");
//计算均方根误差(标准差)
for (int i = 0; i < k; i++) {
f[1] += ((sum / k) - b[i]) * ((sum / k) - b[i]);
}
f[1] = Math.sqrt(f[1] / k);
writer.write("均方根误差(标准差)是:" + f[1] + "\n");
//计算灰度级中位数
if (k % 2 == 0)
e = (b[k / 2] + b[k / 2 + 1]) / 2;
else
e = b[k / 2 + 1];
writer.write("中位数是:" + e + "\n");
//计算众数
for (int i = b[0]; i <= b[k - 1]; i++) {//范围是最小值和最大值之间的唯一值
y[i] = i;//由于排序了,所以第一个肯定是最小的灰度级
for (int j = 0; j < k; j++) {//统计对象是所有的像元值
if (y[i] == b[j])//如果该灰度级等于其中一个像元值
m[i]++;//这个灰度级中的像元数量加一
}
if (t < m[i]) {//不断比较m
t = m[i];//t是频数最大的那个
s = y[i];//把频数最大的灰度级赋给s
}
}
writer.write("众数是:" + s + "\n");
//直方图
for (int i = b[0]; i <= b[k - 1]; i++) {//范围是最小值和最大值之间的唯一值
y[i] = i;//由于排序了,所以第一个肯定是最小的灰度级
if (y[i] < 10) {//如果是个位数的灰度级就加两个空格
writer.write(" ");
}
if (y[i] > 9 && y[i] < 100) {//如果是十位数的灰度级就加一个空格
writer.write(" ");
}
writer.write(y[i] + ":");
for (int j = 0; j < m[i]; j++) {
writer.write("■");
}
writer.write(m[i] + "\n");//m是每个灰度级出现的像元数量(频数)
}
writer.close();
return f;
}
public static void NDVI(int[] c, int[] d, File m) throws IOException {
float[] e = new float[c.length];
BufferedReader br = new BufferedReader(new FileReader(m));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\桌面\\NDVI计算结果.txt"));
//建立两个缓冲区提高读写数据的效率
//可以换格式复制,很厉害
String str;//用来临时存放数据
for (int i = 0; i < 6; i++) {
str = br.readLine();
bw.write(str);//把读取的内容写进去
bw.newLine();//读完一行就开辟新的一行
}
for (int i = 0; i < c.length; i++) {
e[i] = (float) (d[i] - c[i]) / (float) (d[i] + c[i]);
bw.write(e[i] + " ");
}
bw.close();
}
public static void 多波段图像统计(int[] a, int[] b, double[] A, double[] B) throws IOException {
FileWriter writer = new FileWriter("D:\\桌面\\遥感图像统计值.txt", true);
double o = 0;
for (int i = 0; i < a.length; i++) {
o += (a[i] - A[0]) * (b[i] - B[0]);
}
o = o / a.length;
writer.write("两波段的协方差为:" + o + "\n");
o = o / (A[1] * B[1]);
writer.write("两波段的相关系数为:" + o);
writer.close();
}
}
运行结果如下所示:
1.遥感图像统计值.TXT:
D:\桌面\3波段.txt有15行,32列像元,一共480个像元。
D:\桌面\4波段.txt有15行,32列像元,一共480个像元。D:\桌面\3波段.txt该遥感图像DN值最大为:58,最小为:27,平均数是:34.0
均方根误差(标准差)是:6.850638656358982
中位数是:31
众数是:28
27:■■■■■■■■■■■■■■■15
28:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■80
29:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■78
30:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■63
31:■■■■■■■■■■■■■■■■■■■■■■■■■■26
32:■■■■■■■■■■■■■■■■■■■■■■■23
33:■■■■■■■■■■■11
34:■■■■■5
35:■■■■■■■■■■■■12
36:■■■■■■■■■■■■■■■■16
37:■■■■■■■■■■■11
38:■■■■■■■■■9
39:■■■■■■■■8
40:■■■■■■■■8
41:■■■■■■■■■■■■■■■■■■■■20
42:■■■■■■■■■■■11
43:■■■■■■■■■■■■■13
44:■■■■■■■■■■■■■■■■16
45:■■■■■■■■■■■■■■14
46:■■■■■■■■■■■■■■■■16
47:■■■■■■■■8
48:■■■■■5
49:■■2
50:0
51:■■■3
52:■■2
53:■1
54:■■2
55:■1
56:0
57:0
58:■1D:\桌面\4波段.txt该遥感图像DN值最大为:110,最小为:53,平均数是:88.0
均方根误差(标准差)是:15.086072495296227
中位数是:95
众数是:100
53:■1
54:■■2
55:■1
56:■■■■4
57:■■■3
58:■■■■■5
59:■■■■■5
60:■■■■■■■■■9
61:■■■■■5
62:■■■■■■■7
63:■■■■■■■■■■10
64:■■■3
65:■■■■4
66:■■■■4
67:■■■■■■■7
68:■■■■4
69:■■■■■■■7
70:■■■■■■■7
71:■■■■■5
72:■■■■■■6
73:■■■■■■■7
74:■■■■■5
75:■■■■■■6
76:■■■3
77:■■■■■■6
78:■■■3
79:■■■■■5
80:■1
81:■■2
82:0
83:■■2
84:■■2
85:■■■■■■■■8
86:■■■■■■■7
87:■■■3
88:■■■■■■■■■■■11
89:■■2
90:■■■■■■■■■■■■12
91:■■■■■■■■8
92:■■■■■■■■■■■■■13
93:■■■■■■■■■■■■■■■■16
94:■■■■■■■■■■■11
95:■■■■■■■■■■■■■13
96:■■■■■■■■■■■■■■■■■■■■■21
97:■■■■■■■■■■■■■■■15
98:■■■■■■■■■■■■■■■■16
99:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■31
100:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■37
101:■■■■■■■■■■■■■■■■■■■■■■■■■■■■28
102:■■■■■■■■■■■■■■■■■17
103:■■■■■■■■■■■■■■■■■■■■■■22
104:■■■■■■■■■■■■■13
105:■■■■■■■■■■■■■■14
106:■■■■■■6
107:■■■■■■■7
108:■■■■■■6
109:0
110:■■2
两波段的协方差为:-92.20416666666667
两波段的相关系数为:-0.892161126016049
2.NDVI计算结果.TXT:
ncols 32
nrows 15
xllcorner 249175.73284912
yllcorner 3464059.4133911
cellsize 30
NODATA_value -9999
0.26956522 0.30578512 0.26495728 0.25233644 0.2 0.2 0.2631579 0.496063 0.5488722 0.52380955 0.54471546 0.5538462 0.5522388 0.54198474 0.546875 0.49618322 0.4848485 0.5 0.41732284 0.44444445 0.496063 0.5 0.54198474 0.49618322 0.408 0.46031746 0.56060606 0.5503876 0.5538462 0.57251906 0.56060606 0.5503876 0.20353982 0.28695652 0.26126125 0.2173913 0.2413793 0.25454545 0.3508772 0.46774194 0.546875 0.5692308 0.55725193 0.58518517 0.5652174 0.53846157 0.5538462 0.53488374 0.503876 0.52380955 0.46774194 0.41984734 0.52307695 0.54198474 0.5555556 0.41666666 0.21052632 0.2881356 0.488 0.56589144 0.5538462 0.5625 0.5503876 0.53488374 0.1559633 0.3153153 0.37931034 0.28070176 0.22222222 0.19607843 0.2897196 0.34513274 0.42105263 0.5503876 0.5735294 0.5703704 0.56390977 0.5503876 0.578125 0.515625 0.472 0.52 0.52845526 0.42424244 0.44262296 0.41666666 0.35135135 0.2777778 0.1559633 0.094339624 0.32142857 0.52380955 0.56589144 0.53846157 0.5538462 0.5625 0.18867925 0.25 0.2 0.13207547 0.123809524 0.13725491 0.18446602 0.20754717 0.23529412 0.46666667 0.5620438 0.5488722 0.52755904 0.52380955 0.536 0.53488374 0.4918033 0.5121951 0.516129 0.43076923 0.32330826 0.3220339 0.19298245 0.19266056 0.10743801 0.05172414 0.31623933 0.52380955 0.56589144 0.5748032 0.52755904 0.48387095 0.17171717 0.14851485 0.1588785 0.12149533 0.123809524 0.1588785 0.23364486 0.18867925 0.30357143 0.488 0.56060606 0.5538462 0.54330707 0.52307695 0.530303 0.52307695 0.4876033 0.4876033 0.4920635 0.44186047 0.40625 0.424 0.29508197 0.22689076 0.1875 0.136 0.47107437 0.5555556 0.55725193 0.57251906 0.57251906 0.47619048 0.10204082 0.12871288 0.16190477 0.15384616 0.13207547 0.18518518 0.31578946 0.3275862 0.48387095 0.54330707 0.5590551 0.5625 0.53488374 0.53846157 0.54198474 0.511811 0.4789916 0.4915254 0.52380955 0.5 0.44186047 0.488 0.4214876 0.26126125 0.19642857 0.19642857 0.35135135 0.511811 0.5503876 0.52845526 0.5121951 0.4516129 0.14285715 0.09803922 0.13207547 0.16504854 0.16981132 0.26126125 0.37190083 0.46666667 0.552 0.5625 0.5692308 0.5671642 0.504 0.4871795 0.52 0.5 0.4876033 0.5121951 0.52380955 0.503876 0.4375 0.44 0.49593496 0.2792793 0.15044248 0.16521738 0.2521739 0.43089432 0.53125 0.52 0.53846157 0.5 0.23728813 0.10091743 0.09259259 0.15384616 0.25454545 0.27433628 0.24770643 0.47692308 0.5555556 0.5625 0.5692308 0.55725193 0.57664233 0.56589144 0.5590551 0.52 0.511811 0.51937985 0.50793654 0.52755904 0.46564886 0.42857143 0.45454547 0.30508474 0.12727273 0.16071428 0.3043478 0.40983605 0.53488374 0.5503876 0.53846157 0.536 0.34920636 0.17857143 0.17757009 0.3271028 0.36283186 0.27433628 0.3220339 0.50769234 0.53968257 0.56589144 0.57575756 0.59398496 0.5703704 0.5555556 0.57251906 0.5503876 0.511811 0.552 0.536 0.49593496 0.44 0.36507937 0.46341464 0.44347826 0.24561404 0.24786325 0.40495867 0.53125 0.53846157 0.5590551 0.546875 0.5590551 0.44186047 0.41666666 0.408 0.4488189 0.4 0.36206895 0.45454547 0.5503876 0.5625 0.57251906 0.57894737 0.59090906 0.6 0.5882353 0.54330707 0.52845526 0.546875 0.4920635 0.35779816 0.24074075 0.23893805 0.26229507 0.41732284 0.35042736 0.29508197 0.4108527 0.5114504 0.54545456 0.56060606 0.57251906 0.5538462 0.56589144 0.42635658 0.54198474 0.53846157 0.5488722 0.496063 0.53125 0.55725193 0.57894737 0.57251906 0.57251906 0.57894737 0.57894737 0.57894737 0.57894737 0.5503876 0.5206612 0.4789916 0.23809524 0.104761906 0.07272727 0.118644066 0.184 0.18309858 0.29850745 0.3809524 0.530303 0.56060606 0.546875 0.53968257 0.5625 0.5555556 0.536 0.4920635 0.5590551 0.53846157 0.54198474 0.5503876 0.57575756 0.58208954 0.5827338 0.5671642 0.57251906 0.57575756 0.57251906 0.57575756 0.5970149 0.58518517 0.56060606 0.39344263 0.15315315 0.078431375 0.106796116 0.10526316 0.13821138 0.19298245 0.265625 0.4375 0.5522388 0.5538462 0.52845526 0.5041322 0.5692308 0.5625 0.5625 0.52307695 0.5882353 0.58208954 0.53846157 0.546875 0.55725193 0.55725193 0.55725193 0.5590551 0.5625 0.5692308 0.56390977 0.5703704 0.57575756 0.57575756 0.56390977 0.496063 0.31092438 0.13513513 0.10891089 0.12 0.12 0.11340206 0.1588785 0.32307693 0.5114504 0.52845526 0.5371901 0.5294118 0.5462185 0.53333336 0.55 0.5555556 0.5620438 0.5538462 0.5538462 0.54198474 0.5503876 0.5846154 0.5714286 0.5645161 0.5590551 0.5692308 0.57251906 0.57575756 0.5671642 0.57894737 0.5538462 0.5503876 0.54545456 0.41666666 0.2038835 0.14563107 0.18446602 0.12765957 0.14 0.22950819 0.4 0.54330707 0.52755904 0.5813953 0.54471546 0.50442475 0.5221239 0.5827338 0.57664233 0.53846157 0.53846157 0.54330707 0.552 0.5645161 0.55737704 0.5483871 0.5625 0.5692308 0.546875 0.57575756 0.57251906 0.58518517 0.56589144 0.546875 0.546875 0.52671754 0.3392857 0.18095239 0.26785713 0.26415095 0.16666667 0.22033899 0.34375 0.5 0.52755904 0.546875 0.52 0.47008547 0.5254237