Matlab:下标+挤压方便

时间:2011-04-01 12:54:16

标签: matlab

我正在使用matlab并且对它很新。我已经习惯了Java和其他语言。

一些背景:我正在操纵图像,我使用imread,imshow等命令。我想在一个数组中存储多个图像。

所以我做的是

img_list = zeroes(num_images, 1200, 1600, 3) % height,width,RGB

然后我迭代加载img_list(i,:,:,:) = my_image;的图像。这一切都很好。

现在我可以通过imshow(squeeze(img_list(1,:,:,:)))按我想要的方式显示图像。我受不了这个。我想要像imshow(img_list(1))这样简单的事情。

知道我该怎么做吗?

我绝对愿意改变img_list的类型。任何提示都表示赞赏。也许我可以做一些事情,以便img_list中的所有图像都不一定大小相同?

提前致谢。 :)

3 个答案:

答案 0 :(得分:4)

最简单的解决方案是使用cell array。单元格数组的每个元素都是一个容器,可以容纳任何类型和大小的变量。您可以将单元格数组的元素作为array(i)(返回1 x 1单元格)来访问。要访问单元格数组元素的内容,请使用大括号,即array{i}。另请查看CELLFUN,它允许您对每个图像执行操作。

%# initialize the cell array
img_list = cell(num_images);

%# add an image to the cell array
img_list{4} = someImage;

%# display the image
imshow(img_list{4})

%# display only the red channel
imshow(img_list{4}(:,:,3))

答案 1 :(得分:3)

正如Jonas所说,使用单元格数组可能是正确的事情 - 特别是如果你想能够拥有不同大小的图像。但值得一提的是,您可以使简单的4维阵列方法更好一些:使图像编号成为最后一个索引而不是第一个索引。然后你可以说img_list(:,:,:,i) = my_image;imshow(img_list(:,:,:,1));而不需要挤压。这对于内存局部性(因此对于性能)来说可能稍微好一点,尽管它不会比使用单元格数组更好。

答案 2 :(得分:0)

定义本地匿名函数:

  % Get image list from somewhere.
img_list = ...;
% ...

  % Easy-access to individual frames.
nth_image = @(k) squeeze(img_list(k,:,:,:));
image_count = size(img_list,1);

  % Loop over images.
% ...

这允许您编写以下列表:

  % Process each image.
for i = 1 : image_count,
    img = nth_image(i);
    % ...
end

如果您有多个图像列表或经常出现此模式,则可以编写更多通用函数:

function [ img ] = get_nth_image ( img_list, k )
    img = squeeze(img_list(k,:,:,:));
end
function [ img_list ] = set_nth_image ( img_list, img, k )
    img_list(k,:,:,:) = img;
end