создать учебно-испытательный комплекс с основополагающей правдой для гиперспектральных спутниковых снимков - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь создать набор «Обучение и тестирование» на основе моих наземных данных истинности (наблюдения), которые представлены в формате TIF (растр).

На самом деле, у меня есть гиперспектральное изображение (спутниковое изображение), которое имеет 200 измерений (каналов / полос) вместе с соответствующей меткой (17 класс), которые хранятся в другом изображении. Теперь моя цель - реализовать алгоритм классификации, а затем проверить точность с помощью набора данных тестирования.

Моя проблема в том, что я не знаю, как я могу описать своему алгоритму, какой пиксель принадлежит какому классу, а затем разделить их на набор для тарирования и тестирования.

Я предоставил лицемерную идею моей цели, которая заключается в следующем: Но я не хочу этого делать, так как у меня 145 * 145 пикселей затемнены, поэтому нелегко определить местоположение этих пикселей и вручную назначить их соответствующий класс.

обратите внимание, что следующий пример предназначен для трехмерного изображения, и у меня есть изображение 200D, и у меня есть метки (правда), поэтому мне не нужно указывать их, как в следующем коде, но я хочу назначить их элементу пикселей.

   % 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 голосов
/ 03 ноября 2018

В конце концов, я мог решить свою проблему. Следующий код преобразует матрицу (растр) в вектор, а затем я индексирую данные наземной истины, чтобы найти местоположение соответствующего пикселя в гиперспектральном изображении.

Обратите внимание, что я ищу эффективный способ построения обучающего и тестового набора.

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)

Новый.

Я сделал следующее для создания обучающего и тестового набора для #Hyperspectral изображений (набор данных 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);
0 голосов
/ 29 октября 2018

Я правильно понимаю? Во второй строке переменная train получает значения, которые она имеет до сих пор + пиксели красного, зеленого и синего цветов? Мол, вы хотите, чтобы они отображались только красным, зеленым и синим? Только определенные или все из них? Я мог бы представить, что мы определяем матрицу изображения и затем помещаем значения в изображения красным, зеленым и синим слоями. Это поможет? Я бы сделал вам код, если это ваш вопрос :) 1002 *

Редактировать: Решение

%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

Теперь вы получаете ячейку поезда с матрицей в каждой ячейке. Каждая ячейка является одним классом и содержит только те пиксели, которые вы хотите. Вы можете проверить сами, соответствуют ли классы форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...