Скопируйте значения открытой фигуры в Matrix Matlab

У меня есть сохраненный файл Matlab .fig с изображением, и я открываю рис с помощью openfig. Я спрашиваю, как я могу скопировать значения фигуры в матрицу (скажем, img, которая равна 480x640 double), чтобы начать обработку. Если кто может посоветуйте.


person Tak    schedule 06.05.2015    source источник
comment
что такое figure values?   -  person scmg    schedule 06.05.2015
comment
Вопрос @scmg обновлен файлом fig   -  person Tak    schedule 06.05.2015


Ответы (1)


Довольно просто. Предполагая, что ваша фигура открыта, сначала вам нужно убедиться, что у вас есть дескриптор текущей фигуры, поэтому выполните:

h = gcf;

Данные, изображенные на рисунке, обычно являются дочерними элементами объекта axes. Сам объект осей является дочерним элементом фигуры, поэтому вам необходимо получить доступ к ряду иерархических элементов, прежде чем добраться до того, что вам нужно. Таким образом, вам нужно получить дескрипторы axes, а затем получить дочерние элементы дескрипторов axes. Данные, которые отображаются на графике, обычно являются «потомками» объекта Axes. Объекты осей сами являются дочерними элементами фигуры. Вы можете спуститься по их иерархии следующим образом:

axesObjs = get(h, 'Children');  %axes handles
dataObjs = get(axesObjs, 'Children'); %handles to low-level graphics objects in axes   

Открыв вашу фигуру, я вижу, что ваши данные имеют тип Image. Чтобы получить доступ к данным Image, вы хотите получить доступ к полю CData, поэтому вам нужно сделать следующее:

data = get(dataObjs, 'CData');

data теперь должен содержать данные вашего изображения. Поэтому вот полный код, чтобы вы могли скопировать и вставить его в MATLAB:

openfig('input.fig')
h = gcf;
axesObjs = get(h, 'Children');
dataObjs = get(axesObjs, 'Children');
data = get(dataObjs, 'CData');

Вышеупомянутое работает до MATLAB R2013b. Если вы используете MATLAB R2014a и выше, вместо функции get используется точечная нотация, и поэтому:

openfig('input.fig')
h = gcf;
axesObjs = h.Children;
dataObjs = axesObjs.Children;
data = dataObjs.CData;
person rayryeng    schedule 06.05.2015
comment
@shepherd - Никаких проблем. - person rayryeng; 06.05.2015
comment
Знаете ли вы, как я могу установить изображение на colormap(jet), где учитываются только ненулевые значения, чтобы цветовая полоса была правильной? - person Tak; 06.05.2015
comment
Да, установите для всех нулевых значений значение NaN, затем примените к нему цветовую карту jet. Сделайте что-то вроде этого: data(data == 0) = NaN; imagesc(data); colormap(jet); colorbar;. - person rayryeng; 06.05.2015