MATLAB稀疏三维数组的随机取值(用于图像处理,遥感分类的随机精度验证)

首先,在对长时序的影像数据集的修复工作中,需要对修复结果的进行精度验证,在所有的数据范围内,无差别的取随机数。
用到了一个长串的笨方法,涉及到不同矩阵维度之间转换、背景值去除、元素遍历、随机数生成等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 矩阵就是随机数组成的三维数组

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Matlab中的二维数组变成三维图像,可以使用plot3函数。plot3函数可以绘制三维曲线或散点图。首先,需要将二维数组转换为三维坐标系中的点。可以使用meshgrid函数生成x、y坐标,并将二维数组作为z坐标。然后,使用plot3函数绘制三维图像。 以下是一个示例代码: ```matlab % 生成x、y坐标 \[x, y\] = meshgrid(1:size(A, 2), 1:size(A, 1)); % 将二维数组A作为z坐标 z = A; % 绘制三维图像 plot3(x(:), y(:), z(:), 'o'); ``` 这段代码将二维数组A的行绘制为x坐标,列绘制为y坐标,数组元素作为z坐标。然后使用plot3函数绘制三维图像。每个点的坐标由x、y、z三个数组的对应元素确定。 请注意,这只是一个简单的示例,具体的绘图方式可能需要根据具体的需求进行调整。 #### 引用[.reference_title] - *1* *2* [matlab中二维图像的绘制](https://blog.csdn.net/ZHLY0307/article/details/119713320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MATLAB--二维图像和三维图像的绘制](https://blog.csdn.net/m0_58585940/article/details/127602879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值