2014-11-18 12 views
3

Я работаю над кодом Gaussian Pyramid для Matlab. В основном он загружает изображение, создает массив ячеек и заполняет его различными уровнями гауссовой пирамиды.Отображение гауссовой пирамиды, хранящейся в массиве ячеек, в одной фигуре

Я хочу показать содержимое массива ячеек, заполненных изображениями в одной фигуре, , чтобы вы могли увидеть эффект гауссовой пирамиды. Это означает, что исходное изображение имеет полный размер, а остальные уменьшаются на 2 каждый. И все это на одной фигуре.

Я довольно любитель, когда речь заходит о Matlab, поэтому я действительно не знаю, как это сделать. Я уже несколько раз пробовал его с подзаговорами, но не смог.

Заранее спасибо.

+0

относящийся: http://stackoverflow.com/q/12805130/2777181 –

+0

Это также может быть полезно: http://stackoverflow.com/questions/25985144/display-an-image-scale-space-in-matlab/25986017#25986017 – rayryeng

+0

Я внесла несколько изменений в свой ответ, посмотрим, помогает ли это –

ответ

2

Я использовал петлю, чтобы добавить нули в верхней части всех изображений затем объединить их

Sample cell,

im = imread('peppers.png'); 
for i = 1 : 5 
    I{i} = im(1 : 2*i : end, 1 : 2*i : end,:); 
end 

код, I быть вашей клетки,

m = size(I{1}, 1); 
newI = I{1}; 
for i = 2 : numel(I) 
    [q,p,~] = size(I{i}); 
    I{i} = cat(1,repmat(zeros(1, p, 3),[m - q , 1]),I{i}); 
    newI = cat(2,newI,I{i}); 
end 
imshow(newI) 

enter image description here

Для использования 2D-изображений: I{i} = cat(1,repmat(zeros(1 , p),[m - q , 1]),I{i});

enter image description here

+0

Он отображает все изображения ячейки изображения, но один под другим и все тот же размер:/Мне нужно это рядом друг с другом, и поэтому вы можете видеть, что первая запись ячейки - 512x512, следующая - 256x256 ... – DrSkyer

+1

@DrSkyer, посмотри, стало ли теперь лучше, – Rashid

+0

все стало лучше, теперь это одно рядом с другим! Тем не менее все одинаковые размеры:/ – DrSkyer

1

Как насчет:

subplot(numel(YourCell), 1, 1), imshow(YourCell{1}); 
for k=2:5 
    subplot(1,numel(YourCell),k), imshow(YourCell{k}) 
    xlim([1 size(YourCell{1},1)]); 
    ylim([1 size(YourCell{1},2)]); 
end 

Результат (с фиктивными данными):

cascade

Edit:

Вы можете играть с компоновкой своих плиток, вычисляя положение следующего. Вот быстрый и грязный пример, безусловно, вы можете сделать лучше:

бок о бок:

border=5; 
MergedImage=ones(size(YourCell{1},1), 2.5*size(YourCell{1},2)); 
MergedImage(1:size(YourCell{1},1), 1:size(YourCell{1},2))=YourCell{1}; 
Pos=[1, size(YourCell{1},1)+border]; 

for k=1:(numel(YourCell)-1) 
    MergedImage(Pos(1):Pos(1)+size(YourCell{k+1}, 1)-1, Pos(2):Pos(2)+size(YourCell{k+1}, 2)-1)=YourCell{k+1}; 
    Pos=[Pos(1), Pos(2)+size(YourCell{k+1}, 2)+border]; 

end 

imshow(MergedImage); 

cascade2

Или более плотное расположение:

border=5; 
MergedImage=ones(size(YourCell{1},1), 2*size(YourCell{1},2)); 
MergedImage(1:size(YourCell{1},1), 1:size(YourCell{1},2))=YourCell{1}; 
Pos=[1, size(YourCell{1},1)+border]; 

for k=1:(numel(YourCell)-1) 
    MergedImage(Pos(1):Pos(1)+size(YourCell{k+1}, 1)-1, Pos(2):Pos(2)+size(YourCell{k+1}, 2)-1)=YourCell{k+1}; 
    if mod(k,2) == 0 
     Pos=[Pos(1)+size(YourCell{k+1}, 1)+border, Pos(2)]; 
    else 
     Pos=[Pos(1), Pos(2)+size(YourCell{k+1}, 2)+border]; 
    end 
end 

imshow(MergedImage); 

cascade3

+0

Он также отображает все изображения ячейки изображения, но один под другим, а размеры одинаковые. Иммерзание не требуется, поскольку ячейка сама по себе имеет разные размеры. – DrSkyer

+0

Это работает! Но я получаю много пробелов справа (где самое маленькое изображение). – DrSkyer

+0

@DrSkyer измените значение 2.5 в этой строке: 'MergedImage = ones (размер (YourCell {1}, 1), размер 2.5 * (YourCell {1}, 2));' что-то меньшее. Идеально вычислить его как сумму ширины всех ваших изображений плюс n раз границу. –