for i = [I, J, K];
imshow(i);
endI,J,K是16位图像.
该脚本一直试图输出图像(但没有),并进入一个无限循环。
我遗漏了什么吗?
发布于 2017-04-26 01:50: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发布于 2017-04-26 09:56:16
为了更好地理解到底遗漏了哪一点/这里发生了什么:使用方括号就像这里的级联。所以这条线
i = [I, J, K] % separated with commas or spaces for horzcat
i = [I; J; K] % separated with semi-colons for vertcati = horzcat(I, J, K);
i = vertcat(I, J, K);假设I, J, K是64x64灰度值的图像。(水平)连接将创建一个64x192矩阵。for循环将遍历矩阵列,这意味着它将提取一个64x1向量192倍(或者更频繁地用于较大的图像,这可能让人感觉“无限”)。只显示带有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将不起作用,因为这将再次给出向量。
例如,对于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?
https://stackoverflow.com/questions/43623511
复制相似问题