for i = [I, J, K];
imshow(i);
end
I
,J
,K
是16位图片。
脚本不断尝试抽出图像(但不会)并进入无限循环。
我有什么遗失的吗?
答案 0 :(得分:1)
如果尺寸相同,您可以将多个图像存储在矩阵中。
但是,如果图像尺寸不同,则应将图像存储在cell
中。这种方法不那么麻烦,因为您不必担心以后如何提取它们。
定义一个大小等于图像数量的单元格。
numImages = 3;
Images = cell(1,numImage);
将图像I
存储到单元格中:
Images{1,1} = I;
现在查看图片并显示它们
for ii = 1:3
imshow(Images{1,ii});
end
示例:强>
I = imread('cameraman.tif');
J = imread('peppers.png');
K = imread('snowflakes.png');
Images = cell(1,3);
Images{1,1} = I;
Images{1,2} = J;
Images{1,3} = K;
for ii=1:numel(Images)
figure;imshow(Images{1,ii});
end
答案 1 :(得分:0)
为了更好地理解你究竟缺少哪一点/这里发生了什么:使用方括号在这里就像连接一样。这一行
i = [I, J, K] % separated with commas or spaces for horzcat
i = [I; J; K] % separated with semi-colons for vertcat
i = horzcat(I, J, K);
i = vertcat(I, J, K);
假设I, J, K
是64x64灰度值图像。 (水平)连接将创建64x192矩阵。 for
循环将以列为单位通过矩阵,这意味着它将提取192次的64x1向量(或更常用于较大的图像,这可能感觉像“无限”)。仅显示带有imshow()
的矢量将不会显示任何内容。
正如已经指出的,使用单元格是一种更灵活的图像存储方式。使用数组时,您必须处理每个维度(这仅在图像大小相同时才有效):
sizeImage = size(I); % assume all img are same size (as I)
numImages = 3; % needed for allocating array
% init array for imgs and fill images into array: e.g. 64x64x3
imageArray = zeros([sizeImage numImages]);
imageArray(:,:,1) = I; % :,: selects all elements of a dimension
imageArray(:,:,2) = J;
imageArray(:,:,3) = K;
for n = 1:numImages % iterate over image index
figure; imshow(imageArray(:,:,n)); % n = 1, 2 ... , numImages
end % is used for position in imageArray
访问数组/单元格时使用冒号:
选择维度的所有元素。例如。 imageArray(:,:,n)
将选择第一维和第二维的所有元素,对应于64x64图像。对于RGB图像,具有3个图像的阵列将是64x64x3x3,您必须使用imageArray(:,:,:,n)
来选择所有三个颜色通道。
请注意,使用for i = img_array
将不起作用,因为这将再次提供向量。
E.g。对于img_array
:64x64x5(五个64x64灰度值图像),这将迭代除一个维度之外的所有维度(并将剩余的目标分配给i
):img_array(:,1,1)
,img_array(:,2,1)
,img_array(:,3,1)
,...,img_array(:,1,2)
,img_array(:,2,2)
...,img_array(:,64,5)
并将再次为i
生成64 * 3 = 192个向量。
正如已经指出的那样,如果你有可变的图像大小,那么使用单元格数组就是这样。您可以咨询:Difference between cell and matrix in matlab?