我正在尝试根据我的地面真相(观测)数据创建训练和测试集,这些数据以tif(栅格)格式显示。
实际上,我有一个具有200个维度(通道/波段)的高光谱图像(卫星图像)以及对应的标签(17类),这些图像存储在另一幅图像中。现在,我的目标是实现分类算法,然后使用测试数据集检查准确性。
我的问题是,我不知道如何向算法描述哪个像素属于哪个类,然后将它们拆分为皮重和测试集。
我提供了一个关于我的目标的概貌,如下所示: 但是我不想这样做,因为我有145 * 145像素暗淡,因此定义这些像素的位置并手动分配给它们对应的类并不容易。
请注意,以下示例适用于3D图像,我具有200D图像,并且具有标签(地面真实情况),因此无需像下面的代码那样指定它们,但我确实希望将其分配给其pixel成员。
% Assigning pixel(by their location)to different groups.
tpix=[1309,640 ,1;... % Group 1
1218,755 ,1;...
1351,1409,2;... % Group 2
673 ,394 ,2;...
285 ,1762,3;... % Group 3
177 ,1542,3;...
538 ,1754,4;... % Group 4
432 ,1811,4;...
1417,2010,5;... % Group 5
163 ,1733,5;...
652 ,677 ,6;... % Group 6
864 ,1032,6];
row=tpix(:,1); % y-value
col=tpix(:,2); % x-value
group=tpix(:,3); % group number
ngroup=max(group);
% create trainingset
train=[];
for i=1:length(group)
train=[train; r(row(i),col(i)), g(row(i),col(i)), b(row(i),col(i))];
end %for
答案 0 :(得分:1)
我明白这个意思吗?在seconlast行上,train
变量获取它到目前为止具有的值+红色,绿色和蓝色的像素?就像,您希望它们仅以红色,绿色和蓝色显示吗?只有某些或全部?我可以想象我们定义一个图像矩阵,然后将值放置在图像的红色,绿色和蓝色层中。有帮助吗?如果这是您的问题,我会为您提供代码:)
编辑:解决方案
%download the .mats from the website and put them in folder of script
load 'Indian_pines_corrected.mat';
load 'Indian_pines_gt.mat';
ipc = indian_pines_corrected;
gt = indian_pines_gt;
%initiating cell
train = cell(16,1);
%loop to search class number of the x and y pixel coordinates
for c = 1:16
for i = 1:145
for j = 1:145
% if the classnumber is equal to the number in the gt pixel,
% then place the pixel from ipc(x,y,:) it in the train{classnumber}(x,y,:)
if gt(i,j) == c
train{c}(i,j,:) = ipc(i,j,:);
end %if
end %for j
end %for i
end %for c
现在,您获得的训练单元格在每个单元格中都有一个矩阵。每个像元都是一个类,并且只包含所需的像素。您可以自己检查类是否与形状相对应。
答案 1 :(得分:0)
最终,我可以解决我的问题。以下代码将矩阵(Raster)重塑为矢量,然后索引地面真相数据以找到高光谱图像中相应像素的位置。
请注意,我正在寻找一种构建培训和测试集的有效方法。
GT = indian_pines_gt;
data = indian_pines_corrected;
data_vec=reshape(data, 145*145,200);
GT_vec = reshape(GT,145*145,1);
[GT_vec_sort,idx] = sort(GT_vec);
%INDEXING.
index = find(and(GT_vec_sort>0,GT_vec_sort<=16));
classes_num = GT_vec_sort(index);
%length(index)
for k = 1: length(index)
classes(k,:) = data_vec(idx(index(k)),:);
end
figure(1)
plot(GT_vec_sort)
我为创建#高光谱图像(Pine数据集)的训练和测试集做了以下工作。无需使用循环
clear all
load('Indian_pines_corrected.mat');
load Indian_pines_gt.mat;
GT = indian_pines_gt;
data = indian_pines_corrected;
%Convert image from raster to vector.
data_vec = reshape(data, 145*145, 200);
%Provide location of the desired classes.
GT_loc = find(and(GT>0,GT<=16));
GT_class = GT(GT_loc)
data_value = data_vec(GT_loc,:)
% explanatories plus Respond variable.
%[200(variable/channel)+1(labels)= 201])
dat = [data_value, GT_class];
% create random Test and Training set.
[m,n] = size(dat);
P = 0.70 ;
idx = randperm(m);
Train = dat(idx(1:round(P*m)),:);
Test = dat(idx(round(P*m)+1:end),:);
X_train = Train(:,1:200); y_train = Train(:, 201);
X_test = Test(:,1:200); y_test = Test(:, 201);