0

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

首先,视频被切割成单独的帧。第一帧作为样本图片打开,用于定义采样点的坐标。然后目标是从一组帧中选择那些定义坐标的 rgb 值并将它们保存到矩阵中。

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

现在我想将第 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{:})
4

1 回答 1

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),我使用了 images{k} :)

于 2012-05-11T14:30:33.317 回答