Отобразите пирамиду Гаусса, хранящуюся в массиве ячеек, на одной фигуре

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

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

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

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


person DrSkyer    schedule 18.11.2014    source источник
comment
связанные: stackoverflow.com/q/12805130/2777181   -  person Cape Code    schedule 18.11.2014
comment
Это также может быть полезно: matlab">stackoverflow.com/questions/25985144/   -  person rayryeng    schedule 19.11.2014
comment
Я внес несколько изменений в свой ответ, посмотрите, поможет ли это   -  person Cape Code    schedule 19.11.2014
comment
@rayryeng На самом деле это дубликат. При просмотре не нашел. Отличный ответ.   -  person Cape Code    schedule 19.11.2014
comment
@CapeCode - Спасибо! Это немного отличается, потому что OP имеет изображения в массиве ячеек, тогда как я вычисляю изображения с измененным размером на лету. OP может легко изменить код, чтобы использовать механизм массива ячеек вместо динамического изменения размера изображения в соответствии с пространством масштаба.   -  person rayryeng    schedule 19.11.2014
comment
@DrSkyer Я изменил название, чтобы оно было более понятным. Если вам это не нравится, смело откатывайтесь.   -  person Autonomous    schedule 19.11.2014
comment
@ParagS.Chandakkar - название намного лучше.   -  person rayryeng    schedule 19.11.2014


Ответы (2)


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

Образец 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)

введите здесь описание изображения

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

введите здесь описание изображения

person Rashid    schedule 18.11.2014
comment
Он отображает все изображения ячейки изображения, но одно под другим и все одинакового размера: / Мне нужно, чтобы оно было рядом друг с другом, и поэтому вы можете видеть, что первая запись в ячейке - 512x512, следующая - 256x256... - person DrSkyer; 18.11.2014
comment
@DrSkyer, посмотри, стало ли лучше, - person Rashid; 18.11.2014
comment
стало лучше, теперь одно рядом с другим! Все равно все одного размера :/ - person DrSkyer; 18.11.2014
comment
Является ли ImCell{1} самым большим, и они становятся меньше при увеличении индексов? - person Rashid; 18.11.2014
comment
Изображение черно-белое, значения от 0 до 1. Кажется, оно не работает, говоря: «Ошибка с использованием кота». Размеры объединяемых матриц не согласованы. при первом кошачьем использовании. - person DrSkyer; 19.11.2014
comment
@DrSkyer, так что изображения mxnx1. Затем измените repmat(zeros(1,p,3)) на repmat(zeros(1,p)). посмотреть, как это происходит. - person Rashid; 19.11.2014
comment
Это сделало работу! Спасибо, добрый сэр! - person DrSkyer; 21.11.2014

Как насчет:

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

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

каскад

Изменить:

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

Бок о бок:

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

person Cape Code    schedule 18.11.2014
comment
Он также отображает все изображения ячейки изображения, но одно под другим, а размеры одинаковы. Imresize не требуется, потому что сами записи ячеек уже имеют разные размеры. - person DrSkyer; 18.11.2014
comment
Этот работает! Но у меня много пробелов справа (там, где самое маленькое изображение). - person DrSkyer; 19.11.2014
comment
@DrSkyer измените значение 2,5 в этой строке: MergedImage=ones(size(YourCell{1},1), 2.5*size(YourCell{1},2)); на что-то меньшее. В идеале вычислите его как сумму ширины всех ваших изображений плюс n раз границы. - person Cape Code; 19.11.2014