我是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{:})
答案 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}:)