首先,在对长时序的影像数据集的修复工作中,需要对修复结果的进行精度验证,在所有的数据范围内,无差别的取随机数。
用到了一个长串的笨方法,涉及到不同矩阵维度之间转换、背景值去除、元素遍历、随机数生成等matlab基础操作,做一下笔记,以后用到了可以来看一下。
具体:一组三维多波段的遥感影像,规格大小相同,但是并不是所有像元点都有值,在所有影像的有值范围内均匀取点,适用于对比多幅影像变换的前后值。其基本原理就是,将所有应影像读入一个三维稀疏矩阵(无值为0时),转为一维稀疏矩阵,转为一维密集矩阵,随机取点,转回一维稀疏,转回三维稀疏矩阵。
0.读入影像
listing = dir(’.tif’); %通过dir函数,将所有数据名称列出来
NUM_DATA = length(listing); %识别有多少景影像
filename1 = listing(1,1).name; %获取第一幅影像的文件名
data1= imread(filename1); %读取第一幅影像到矩阵
[ROW_DATA,COL_DATA]=size(data1); %获取它的行列数
dataArray = single(NaNones(ROW_DATA,COL_DATA,NUM_DATA)); %定义以一个数组,放下所有的数据行列*个数 16位浮点数
for k=1:NUM_DATA
filename = listing(k,1).name;%获取文件名
data = imread(filename);%读入数据进data数组里
dataArray(:,:,k) =data;%放入三维矩阵里
end
dataArray(dataArray<=0)=nan; %背景值去除(部分为NAN,部分小于0,都视为无值)
dataArray(isnan(dataArray))=0; %Nan值转化成0
1.三维转一维稀疏
feiling=sum(dataArray(:)~=0); % 有效值的个数
data0=single(dataArray(:); %三维转一维(先放第一幅第一列)
2.一维稀疏转一维密集
xyz=ROW_DATACOL_DATANUM_DATA; %总像元数
data1=single(zeros(feiling,1)); %存储有效值的一维矩阵
num = 1;
for i = 1:xyz
if data0(i,1)~=0
data1(num,1)=data0(i,1); %提取出有效值
num=num+1;
end
end
3.随机取点
data2=single(zeros(feiling,1)); %储存随机数据
randnum=randperm(feiling)’; %产生随机重排列(百度randperm函数)
suijishu=round(0.01*feiling); %保留随机数1%,最近取整
for i=1:suijishu
data2(randnum(i),1)=data1(randnum(i),1); %保留随机数到data2相同位置
end
4.转回大稀疏矩阵
data3=single(zeros(size(data0))); % xyz的大稀疏矩阵
ii=1;
for i=1:xyz
if data0(i,1)~=0
data3(i,1)=data2(ii,1); %转大稀疏矩阵
ii=ii+1;
end
end
5.转回三维矩阵
dataArray1=single(zeros(size(dataArray))); %原始三维矩阵
jj=1;
for k=1:NUM_DATA
for j = 1:COL_DATA
for i = 1:ROW_DATA
dataArray1(i,j,k)=data3(jj,1); %转入三维矩阵
jj=jj+1;
end
end
end%% dadaArray1 矩阵就是随机数组成的三维数组