带有“imshow”的意外无限循环
Unintended infinite loop with `imshow`
for i = [I, J, K];
imshow(i);
end
I
、J
、K
是 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
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?
for i = [I, J, K];
imshow(i);
end
I
、J
、K
是 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
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?