Matlab: подписать + сжать удобно - PullRequest
2 голосов
/ 01 апреля 2011

Я использую Matlab и совершенно новый для него.Я привык к Java и другим языкам.

Немного предыстории: я манипулирую изображениями, работаю с командами imread, imshow и т. Д.Я хочу сохранить несколько изображений в массиве.

Итак, я делаю

img_list = zeroes(num_images, 1200, 1600, 3) % height,width,RGB

, а затем загружаю изображения с img_list(i,:,:,:) = my_image; итеративно.Это все работает нормально.

Теперь я могу отображать изображения, как я хочу, выполнив imshow(squeeze(img_list(1,:,:,:))).Я терпеть не могу это.Я хотел бы что-то простое, как imshow(img_list(1)).

Любая идея, как я могу это сделать?

Я определенно готов изменить тип img_list.Любые намеки приветствуются.Может быть, я мог бы сделать что-нибудь, чтобы все мои изображения в img_list не обязательно были одного размера?

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

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Самое простое решение - использовать массив ячеек .Каждый элемент массива ячеек является контейнером, который может содержать переменную любого типа и размера.Вы получаете доступ к элементу массива ячеек как array(i) (который возвращает ячейку 1 на 1).Для доступа к содержимому элемента массива ячеек вы используете фигурные скобки, то есть array{i}.Также обратите внимание на CELLFUN , который позволяет выполнять операции с каждым изображением.

%# initialize the cell array
img_list = cell(num_images);

%# add an image to the cell array
img_list{4} = someImage;

%# display the image
imshow(img_list{4})

%# display only the red channel
imshow(img_list{4}(:,:,3))
3 голосов
/ 01 апреля 2011

Использование массива ячеек, как предположил Джонас, вероятно, правильно, особенно если вы хотите иметь возможность получать изображения разных размеров.Но стоит упомянуть, что вы можете сделать простой подход к 4-мерным массивам немного приятнее: сделать номер изображения последним индексом, а не первым.Тогда вы можете сказать img_list(:,:,:,i) = my_image; и imshow(img_list(:,:,:,1)); без необходимости сжатия.Вероятно, это немного лучше для локальности памяти (а значит, и для производительности), хотя это не будет лучше, чем использование массивов ячеек.

0 голосов
/ 01 апреля 2011

Определить локальную анонимную функцию:

  % Get image list from somewhere.
img_list = ...;
% ...

  % Easy-access to individual frames.
nth_image = @(k) squeeze(img_list(k,:,:,:));
image_count = size(img_list,1);

  % Loop over images.
% ...

Это позволяет написать следующий список:

  % Process each image.
for i = 1 : image_count,
    img = nth_image(i);
    % ...
end

Если у вас несколько списков изображений или этот шаблон встречается часто, вы можете написать более общие функции:

function [ img ] = get_nth_image ( img_list, k )
    img = squeeze(img_list(k,:,:,:));
end
function [ img_list ] = set_nth_image ( img_list, img, k )
    img_list(k,:,:,:) = img;
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...