我正在使用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
中的所有图像都不一定大小相同?
提前致谢。 :)
答案 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