2014-09-23 60 views
3

我有8個圖像,我想以下面顯示的縮放空間格式顯示它們。原始圖像的高度和寬度爲256.然後在原始圖像的右側,每一層的大小減少2.像這裏一樣,圖像的高度和寬度是256.在原始圖像的右側,高度和寬度是128 ,64,32,16,8,4,2.在MATLAB中顯示圖像縮放空間

我有所有的圖像各自的尺寸。我只是想知道如何根據下面顯示的模式排列圖像。提前致謝。

enter image description here

回答

4

這就像你正在試圖建立一個尺度空間和顯示結果給用戶。這不是一個問題。請記住,您必須使用for循環執行此操作,因爲我沒有看到您將如何執行此操作,除非您複製並粘貼多行代碼。其實,我會用while循環,我會告訴你爲什麼很快。

在任何情況下,您都需要聲明一個輸出圖像,其行數與原始圖像一樣多,但這些列將是原始圖像的1.5倍以適應右側的圖像。

首先,編寫代碼將原始圖像放置在左側,將版本放在右側一半。一旦你這樣做了,你就編寫一個for循環,使用索引將圖像放在正確的位置,直到用完縮放,並且需要跟蹤下一個圖像開始和下一個圖像結束的位置。請記住,第一個子採樣後的下一個圖像的起始位置將從原始圖像的列位置開始,並且該行位於前一個圖像結束的位置。作爲一個例子,我們使用cameraman.tif圖片,該圖片恰好爲256 x 256,但我會編寫代碼,以便它符合您想要的任何圖像分辨率。當我對圖像進行二次採樣時,我將在MATLAB中使用imresize來幫助調整圖像大小,並且我將指定一個採樣因子0.5來表示子採樣2。我之所以會使用while循環代替,是因爲因爲我們可以保持循環並調整大小,直到調整大小的圖像的尺寸之一是1。在這種情況下,沒有更多的規模需要處理,所以我們可以退出。

這樣:

%// Read in image and get dimensions 
im = imread('cameraman.tif'); 
[rows,cols] = size(im); 

%// Declare output image 
out = zeros(rows, round(1.5*cols), 'uint8'); 
out(:,1:cols) = im; %// Place original image to the left 

%// Find first subsampled image, then place in output image 
im_resize = imresize(im, 0.5, 'bilinear'); 
[rows_resize, cols_resize] = size(im_resize); 
out(1:rows_resize,cols+1:cols+cols_resize) = im_resize; 

%// Keep track of the next row we need to write at 
rows_counter = rows_resize + 1; 

%// For the rest of the scales... 
while (true) 
    %// Resize the image 
    im_resize = imresize(im_resize, 0.5, 'bilinear'); 
    %// Get the dimensions 
    [rows_resize, cols_resize] = size(im_resize); 
    %// Write to the output 
    out(rows_counter:rows_counter+rows_resize-1, cols+1:cols+cols_resize) = ... 
     im_resize; 

    %// Move row counter over for writing the next image 
    rows_counter = rows_counter + rows_resize; 

    %// If either dimension gives us 1, there are no more scales 
    %// to process, so exit. 
    if rows_resize == 1 || cols_resize == 1 
     break; 
    end 
end 

%// Show the image 
figure; 
imshow(out); 

這是我得到的圖像:

enter image description here

+0

我得到的黑色圖像輸出。而且,所有縮放的圖像都存在於L {}數組中。我在上面的帖子中添加了你的代碼。你能告訴一下嗎? – nikhilk 2014-09-23 04:00:51

+2

@nikhilk - 您的代碼有效。但是,你將它完全變黑的原因是因爲你的圖像是'double'並且在'[0,1]'之間進行了規範化。我認爲你的圖像是'uint8',所以預期的範圍在'[0,255]'之間。如果你輸出'uint8',並且你的強度介於'[0,1]'之間,那麼你將不會看到任何東西!因此,將'out'聲明改爲這個:'out = zeros(rows,round(1.5 * cols));'。 – rayryeng 2014-09-23 04:23:57

+0

哦,明白了。謝謝:) – nikhilk 2014-09-23 04:29:37