将矩阵中的每n行提取到循环中的另一个矩阵

时间:2012-05-11 13:45:17

标签: matlab loops matrix extract

我是matlab的初学者,我正在编写一个用于从热成像视频中提取数据的脚本。

首先,视频在不同的帧中剪切。打开第一帧作为样本图片以定义采样点的坐标。然后,目标是从一组帧中选择那些定义坐标的rgb值,并将它们保存到矩阵中。

现在我将矩阵分离为n个较小的矩阵存在问题。 例如,我将要选择的点数定义为n = 2,图片数为31.现在它返回一个矩阵,说明31个图片的rgb代码,每个代码在2个点,在62x3双矩阵中......

现在我想将第1,第3,第5 ......等行提取到一个新矩阵......这应该在一个循环中完成,根据n个点的数量...例如5每张图片上的点等于5个矩阵,包含31张图片的值......

这是我的代码分析图片的摘录,它返回矩阵'值'

files = dir('*.jpg');
num_files = numel(files);

images = cell(1, num_files);
cal=imread(files(1).name);

n = input('number of selection points?: ');

imshow(cal);

[x,y] = ginput(n);

eval(get(1,'CloseRequestFcn'))

%# x = input('x-value?: ');   manual x selection
%# y = input('y-value?: ');   manual y selection

for k = 1:num_files
    images{k} = imread(files(k).name); 
end

matrix=cell2mat(images);
count=(0:size(matrix,1):size(matrix,1)*num_files);

for k = 1:num_files
    a(k)= mat2cell(impixel(matrix,x+count(k),y));
end

values = cat(1,a{:})

1 个答案:

答案 0 :(得分:0)

轻松修复

你的意思是,如果你有:

n = 2;
k = 2; % for example
matrix = [1 2 3;
          4 5 6;
          7 8 9;
          8 7 6];

你希望它成为

b{1} = [1 2 3;
        7 8 9];
b{2} = [4 5 6;
        8 7 6];

这可以通过以下方式轻松完成:

 for ii = 1:n
     b{ii} = matrix(1:n:end,:);
 end

更好的修复

当然,也可以重塑数据矩阵并使用它来代替较小的矩阵:(继续我的样本数据^^)

>> d=reshape(matrix',3,2,[]);
>> squeeze(d(:,1,:))

ans =

     1     7
     2     8
     3     9
>> squeeze(d(:,2,:))

ans =

     4     8
     5     7
     6     6

良好做法

或者,我的首选:以易于访问的方式立即保存数据。在这里,我认为它将是一个大小的矩阵:[num_files x num_points x 3]

如果你想要所有的第一点:

rgb_data(:,1,:)

只有这些点的红色通道:

rgb_data(:,1,1)

等等。 我认为这是可能的:

rgb_data = zeros(num_files, num_points, 3);
for kk = 1:num_files
    rgb_data(kk,:,:) = impixel(images{kk},x+count(k),y);
end

但我不明白你的代码的完整含义(例如:为什么matrix=cell2mat(images) ???然后当然:

count=(0:size(matrix,1):size(matrix,1)*num_files);

只是count=0:num_files; 所以我不确定impixel(matrix,x+count(k),y)会发生什么,我使用了图像{k}:)