2017-04-26 94 views
1
for i = [I, J, K]; 
    imshow(i); 
end 

IJK是16位的圖像。意外無限循環imshow`

該腳本不斷嘗試抽出圖像(但沒有)並進入無限循環。

有什麼我失蹤了嗎?

回答

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 
0

爲了更好地理解你錯過了哪些點/這裏發生了什麼:使用方括號在這裏像串聯一樣工作。太行

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

不一樣horzcatvertcat

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

比方說I, J, K是64×64的灰度值圖像。 (水平)級聯會創建一個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(5×64灰度值圖像),這將遍歷所有,但一個尺寸(以及分配剩餘暗淡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?