创建具有地面实况的高光谱卫星影像训练和测试集

时间:2018-10-29 13:57:07

标签: matlab computer-vision classification octave

我正在尝试根据我的地面真相(观测)数据创建训练和测试集,这些数据以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

2 个答案:

答案 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);