Контрастный цвет для NaNs в изображениях - PullRequest
7 голосов
/ 13 декабря 2011

Я заполняю неиспользуемые элементы в матрице с помощью NaN, и я хотел бы назначить контрастный цвет для этих элементов со значением NaN при отображении данных, используя imagesc.

Ниже приведена ссылка навозможное решение, но я не совсем понимаю.

http://www.mathworks.com/matlabcentral/newsreader/view_thread/19985

Ответы [ 3 ]

16 голосов
/ 13 декабря 2011

Значения NaN получают первый цвет из цветовой карты осей, который по умолчанию соответствует минимальному значению (кроме NaN).Вы можете изменить цвет для ограничения цвета осей минимального значения с помощью функции CAXIS .Чтобы назначить контрастный цвет для значений NaN, вы можете добавить специальный цвет для значений NaN в качестве первого цвета (вектор 1x3).

Я воспользовался вашим примером и создал функцию (с некоторыми комментариями):

function [h hcb] = imagescwithnan(a,cm,nanclr)
% IMAGESC with NaNs assigning a specific color to NaNs

%# find minimum and maximum
amin=min(a(:));
amax=max(a(:));
%# size of colormap
n = size(cm,1);
%# color step
dmap=(amax-amin)/n;

%# standard imagesc
him = imagesc(a);
%# add nan color to colormap
colormap([nanclr; cm]);
%# changing color limits
caxis([amin-dmap amax]);
%# place a colorbar
hcb = colorbar;
%# change Y limit for colorbar to avoid showing NaN color
ylim(hcb,[amin amax])

if nargout > 0
    h = him;
end

Здесь оператор caxis назначает первый цвет карты цветов не минимальному значению amin, а amin-dmap.Таким образом, первый цвет назначается специально для NaN.


Попробуйте эту функцию с:

a=peaks;
a(a < 0.5) = nan;
imagescwithnan(a,hot,[0 1 1]) %# [0 1 1] is cyan

test image - NaN color is hidden

Если вы прокомментируете оператор ylim вфункция (можно управлять с помощью дополнительного параметра) этот цвет NaN будет на карте цветов.

test image - NaN color is shown on the colorbar

2 голосов
/ 13 декабря 2011

Существует два основных шага использования нескольких цветовых карт:

  1. Сложите новую цветовую карту со старой.
  2. Сдвиньте новые значения, которые вы хотите отобразитьэта новая цветовая карта, так что отношение диапазона (новые данные) к диапазону (старые данные) такое же, как nrow (новая цветовая карта) к nrow (старая цветовая карта).

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

Упрощенный пример:

% Make image data
img = -5:5;

% Plot with original colormap
figure
imagesc(img);
colormap(hot(8))

% Add in an NaN
img(3) = NaN;

% Make new colormap
n = 8;
cols = [0 0 1 %blue
        hot(n)];

% Plot with new colormap
figure
h = imagesc(img);
colormap([0 0 1; hot(8)])

% Scale data so that the range proportions match the colormap sizes
cdata = get(h, 'CData');
img_range = range(cdata(:));
cdata(isnan(cdata)) = min(cdata(:)) - img_range/n;
set(h, 'CData', cdata);

enter image description here

enter image description here

1 голос
/ 18 мая 2017

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

В итоге используйте следующее:

imagesc(Z,'AlphaData',~isnan(Z))

В качестве альтернативы обратите внимание, что pcolor игнорирует nan с по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...