Обработка стека изображений в matlab

#matlab

#matlab

Вопрос:

В настоящее время я работаю над задачей обработки изображений, которая требует от меня одновременной обработки всего набора изображений в формате png в Matlab (у меня очень ограниченные знания Matlab). Я просмотрел различные сайты, пытаясь выяснить, как это сделать. Моя последняя попытка была основана на ответе по этой ссылке:http://www.mathworks.com/matlabcentral/answers/7665-images-to-stacks , однако я продолжаю получать ошибку: «Назначение имеет больше не одноэлементных rhs-измерений, чем не одноэлементных индексов». Мои файлы в формате png пронумерованы последовательно (Heart 001.png, Heart 002.png, …), и мой точный код выглядит следующим образом:

 I = zeros(240,320,253,'uint8');
for ii = 1:253
    I(:,:,ii) = imread(sprintf('Heart %s.png'),num2str(ii,'i')));
end
  

Буду признателен за любую помощь!

Ответ №1:

Ваш код для чтения изображений выглядит нормально, но способ, которым вы создаете имена файлов, неверен. Вы передаете результат num2str в imread в качестве аргумента формата изображения, но вы намеревались передать его в sprintf . Как насчет того, чтобы попробовать imread(sprintf('Heart d.png', ii)); ?

Комментарии:

1. Извините, последний комментарий был неполным. Я хотел сказать: Другой метод, который я пробовал, это: для k = 1:253 PNGFileName = strcat(‘Heart’,32, num2str(k), ‘.png’); ImageData = imread(sprintf(PNGFileName)); imshow(ImageData) end, который выполняется без ошибок, однако показывает только последний фрагмент стека.

2. Несколько моментов: (a) strcat('Heart ',32, num2str(k), '.png'); не дал бы вам серию имен файлов, которые вы описали в вашем первоначальном вопросе, вместо этого он включал бы два пробела между сердцем и числом, и число не было бы дополнено нулем. (b) MATLAB обновляет рисунки только в конце выполнения, таким образом, вы видите только последнее изображение. Чтобы принудительно обновить фигуру, используйте drawnow или pause .

3. Спасибо вам за ваш ответ! На самом деле мои файлы heart сохраняются обоими способами (с заполнением нулем и без заполнения нулем), поэтому при запуске этого конкретного скрипта я удостоверяюсь, что текущая папка открыта для файлов heart, которые (Heart 1.png, Heart 2.png, …) Я забыл сказать это в своем комментарии. В любом случае, при использовании drawnow команды теперь я могу видеть, как рисунок меняется, поскольку каждый отдельный фрагмент перезаписывает предыдущий, однако в итоге рисунок по-прежнему остается только последним фрагментом.

Ответ №2:

Я нашел решение для загрузки imshow3D.m с http://www.mathworks.com/matlabcentral/fileexchange/41334-imshow3d—3d-imshow — , а затем реализуем следующий код:

 clear;
clc;

I = zeros(240,320,253,'uint8');
for k = 1:253
    PNGFileName = strcat('Heart ',32, num2str(k), '.png');
    imageData = imread(sprintf(PNGFileName));
    Heart = imageData(:,:,1);
    I(:,:,k) = Heart;

end
imshow3D(I)