带有“imshow”的意外无限循环

Unintended infinite loop with `imshow`

for i = [I, J, K];
   imshow(i);
end

IJK 是 16 位图像。

脚本不断尝试抽出图像(但没有)并进入无限循环。

有什么我遗漏的吗?

如果多张图片大小相同,您可以将它们存储在一个矩阵中。 但是,如果图像大小不同,您应该将它们存储在 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

为了更好地理解您的确切位置,missing/what 发生在此处:使用方括号在这里就像连接一样。所以行

i = [I, J, K]    % separated with commas or spaces for horzcat
i = [I; J; K]    % separated with semi-colons for vertcat

horzcat or vertcat相同:

i = horzcat(I, J, K);
i = vertcat(I, J, K);

假设 I, J, K 是 64x64 灰度值图像。 (水平)串联将创建一个 64x192 矩阵。 for 循环将按列遍历您的矩阵,这意味着它将提取 64x1 向量 192 次(或者对于较大的图像更频繁,这可能感觉像 "infinite")。仅显示带 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

访问 arrays/cells select 维度的所有元素时使用冒号 :。例如。 imageArray(:,:,n) 将 select 第一维和第二维的所有元素,对应于 64x64 图像。对于 RGB 图像,包含 3 个图像的数组将为 64x64x3x3,您必须使用 imageArray(:,:,:,n) 到 select 所有三个颜色通道。

请注意,使用 for i = img_array 将不起作用,因为这将再次提供向量。

例如对于 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 个向量33=]

正如已经指出的那样,如果图像大小可变,则可以使用元胞数组。您可能想咨询:Difference between cell and matrix in matlab?