#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)