Преобразование 3D-изображения в цветовую карту

У меня есть 3D-изображение, которое я хочу использовать в качестве цветовой карты. У меня есть поток данных в реальном времени, и в зависимости от моего текущего положения я хочу, чтобы мой график отображал определенный цвет на основе моего 3D-изображения.

Я сделал это ранее с успехом, используя изображение размером 1080x1920 (2D-изображение), используя следующий код для преобразования его в изображение.

Color=double(imresize(RGBparam.image,[81 144]))/255;

затем нарисуйте его, установив свои данные (я уже создал рисунок ранее... этот код не должен иметь значения), где size(myData(:,:1)) выводит 81x144... Ydata и Zdata также имеют одинаковые размеры.

set(Fig.figim, 'CData', Color);
set(Fig.figim, 'XData', myData(:,:,1) + positionX)
set(Fig.figim, 'YData', myData(:,:,2) + positionY);
set(Fig.figim, 'ZData', myData(:,:,3) + positionZ);

Так что работало нормально! Теперь у меня есть новое 3D-изображение. Размер изображения 512x512x351. Я пытался сделать тот же код, но он не работает. Я пробовал это:

Color=double(imresize(DICOMparam.Vd,[81 144]))/255;

Затем я пытаюсь построить такой сюжет

set(Fig.figim, 'CData', Color);
set(Fig.figim, 'XData', myData(:,:,1) + positionX)
set(Fig.figim, 'YData', myData(:,:,2) + positionY);
set(Fig.figim, 'ZData', myData(:,:,3) + positionZ);

Но затем я получаю сообщение об ошибке: «Цвет должен быть матрицей M на N или массивом M на N на 3».

Теперь я попытался что-то изменить, так что он оказался массивом M на N на 3, но, прежде всего, я не хочу этого... Я хочу сохранить больше, чем просто 3 образца z- размер моей цветовой карты... и, во-вторых... она все равно выдает мне кучу ошибок. Итак, в заключение, я просто хочу, чтобы эта трехмерная карта цветов работала, когда я рисую свои данные, которые имеют компоненты x, y и z. Спасибо за помощь, дайте знать, если что-то непонятно!


person spaderdabomb    schedule 20.08.2013    source источник


Ответы (1)


Представьте свое 2D/3D изображение в виде цветного квадрата/куба. Что вы хотите сделать (если я правильно понимаю), так это раскрасить каждую точку в myData в зависимости от того, где она попадает в этот квадрат/куб.

Однако это не то, как CData работает в Matlab. Он отображает цвета на основе индексированного местоположения, а не фактических значений в матрице. Поэтому, если ваши данные M-by-N, ваша цветовая карта M-by-N - например. независимо от фактических значений данных, myData(1,1) окрашивается в соответствии с myColormap(1,1).

В случае массива M на N на 3 это все еще просто индексированные местоположения, но три значения в каждом случае определяют цвет в RGB.


Можно делать то, что вы хотите, вам просто нужно напрямую указать Matlab, какой цвет в этом кубе 512 x 512 x 351 вы хотите применить к каждой точке. Предполагая, что у вас есть способ преобразовать позиции x, y, z в myData в приблизительные координаты в цветовом пространстве 512 x 512 x 351:

xData = myData(:,:,1); 
yData = myData(:,:,2);
zData = myData(:,:,3);

% some magic here happens to make xData 1-512, yData 1-512, zData 1-351
% may require shifts, scaling, rounding as appropriate
% depends on what your myData contains exactly
% values should be integers

% now we find the positions of those points within the 512 x 512 x 351 colorspace
% size of newcmap should be 81 x 144 in your case
cind = sub2ind(size(Color),xData,yData,zData);
newcmap = Color(cind);

set(Fig.figim, 'CData', newcmap);
person nkjt    schedule 28.08.2013
comment
Спасибо, что, наконец, ответили на этот вопрос, хотя я понял это, но теперь =p. Я сделал то же самое, что вы в основном описали, мне просто пришлось переработать размеры моих данных. - person spaderdabomb; 28.08.2013