首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非预期的无限循环与“不显示”

非预期的无限循环与“不显示”
EN

Stack Overflow用户
提问于 2017-04-26 01:29:08
回答 2查看 117关注 0票数 1
代码语言:javascript
复制
for i = [I, J, K];
   imshow(i);
end

IJK是16位图像.

该脚本一直试图输出图像(但没有),并进入一个无限循环。

我遗漏了什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-26 01:50:16

如果图像大小相同,则可以将多个图像存储在一个矩阵中。但是,如果图像大小不同,则应该将它们存储在cell中。这种方法不那么麻烦,因为您不需要担心以后如何提取它们。

定义大小等于图像数量的单元格。

代码语言:javascript
复制
numImages = 3;
Images = cell(1,numImage);

将图像I存储到单元格中:

代码语言:javascript
复制
Images{1,1} = I;

现在看一看这些图像,并展示给他们看

代码语言:javascript
复制
for ii = 1:3
    imshow(Images{1,ii});
end

示例:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-04-26 09:56:16

为了更好地理解到底遗漏了哪一点/这里发生了什么:使用方括号就像这里的级联。所以这条线

代码语言:javascript
复制
i = [I, J, K]    % separated with commas or spaces for horzcat
i = [I; J; K]    % separated with semi-colons for vertcat

是否与horzcatvertcat相同?

代码语言:javascript
复制
i = horzcat(I, J, K);
i = vertcat(I, J, K);

假设I, J, K是64x64灰度值的图像。(水平)连接将创建一个64x192矩阵。for循环将遍历矩阵列,这意味着它将提取一个64x1向量192倍(或者更频繁地用于较大的图像,这可能让人感觉“无限”)。只显示带有imshow()的向量不会显示任何内容。

正如已经指出的,使用单元格是一种更灵活的存储图像的方法。在使用数组时,您必须处理每个维度(只有在图像大小相同时才能这样做):

代码语言:javascript
复制
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将不起作用,因为这将再次给出向量。

例如,对于img_array:64x64x5 (5个64x64灰度图像),这将遍历除一个维度之外的所有维度(并将剩余的dim分配给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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43623511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档