Как отображать изображения RGB в Matlab, где каждый канал представляет собой отдельную матрицу?

Мне дали набор данных с человеческими лицами в формате Matlab, но я не знаю, как отобразить изображения после того, как я импортировал набор данных в Matlab.

Размер матрицы 60х60х3х1000, значит, изображения размером 60х60, на каждое изображение приходится 3 канала RGB, и таких изображений 1000.

Я не могу понять, как выполнять базовые операции, например отображать i-е лицо в цвете.

Спасибо


person user2225930    schedule 21.04.2013    source источник
comment
Как насчет image(x(:, :, :, ii))?   -  person wakjah    schedule 22.04.2013
comment
Я получаю сообщение об ошибке: TrueColor CData содержит элемент вне диапазона 0,0 ‹= значение ‹= 1,0   -  person user2225930    schedule 22.04.2013
comment
попробуйте: изображение (сжать (x (:, :, :, i))).   -  person bas    schedule 22.04.2013


Ответы (2)


Вы пробовали image(1:60, 1:60, Images(:, :, :, i))?

Чтобы получить отдельный канал, вы можете сделать:

colormap(gray)
image(Images(:,:,1,i))

or

colormap(gray)
image(Images(:,:,2,i))

or

colormap(gray)
image(Images(:,:,3,i))

Это должно разделить каналы для вас и масштабировать отдельные цветовые компоненты до правильных уровней насыщенности.

Кроме того, если вы получаете сообщение об ошибке о выходе за пределы допустимого диапазона, попробуйте:

imagesc(1:60, 1:60, Images(:, :, :, i)) 

Тем не менее, мне трудно поверить, что ваш профессор или коллега не давал вам данные RGB в стандартном формате [0,255]. Однако, если вы сделаете это, imagesc будет бесполезно сравнивать цветовые каналы рядом друг с другом.

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

min(Images(:, :, 1, 1))
max(Images(:, :, 1, 1))

Если на самом деле это какие-то числа с плавающей запятой, я могу показать вам, как масштабировать их до стандартного целочисленного представления RGB.

person Community    schedule 23.04.2013

Похоже, что данные заданы в диапазоне [0..255], но имеют тип double (а не uint8).

Итак, для получения k-го изображения нужно

Im_k = uint8( squeeze( Images(:,:,:,k) ) );

или, если вы хотите использовать числа с плавающей запятой двойной точности

Im_k = squeeze( Images(:,:,:,k) ) / 255;

(Я не уверен на 100%, что вам нужно использовать squeeze в этом случае).

Показать изображение

figure('Name', 'Showing k-th face');
imshow( Im_k );
person Shai    schedule 23.04.2013