Цветовая карта графика поверхности Matlab с несколькими шкалами - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующий пример набора данных, охватывающего домен [x,y]:

test=[2.58,2.2, 0.00023, 0.000163, 0.000123, 0.000164, 0.00022,   2.18, 2.56,2.56; 
 2.46,2.17, 0.00021, 0.000150, 0.000119, 0.000141, 0.00020,  2.16, 2.43, 2.56; 
 2.35,2.14, 0.00019, 0.000143, 0.000101, 0.000136, 0.00018,  2.14, 2.36,2.56; 
2.23,2.12,  0.000184, 0.000138, 0.000095, 0.000124, 0.000166, 2.12, 2.24,2.56; 
 2.2,2.11, 0.000177, 0.000141, 0.00009, 0.000101, 0.000156,  2.09, 2.18, 2.56; 
 2.25,2.1, 0.000176, 0.000168, 0.00008, 0.000095, 0.000164, 2.08, 2.26, 2.56; 
 2.32,2.13, 0.000183, 0.000178, 0.000086, 0.000104, 0.000177,  2.11, 2.35,2.56; 
2.44, 2.15, 0.00019, 0.000191, 0.000099, 0.000112, 0.000189,  2.13, 2.44,2.56; 
 2.56, 2.17,0.00021, 0.000199, 0.000101, 0.000132, 0.000199,  2.15, 2.52,2.56; 
 2.59, 2.19, 0.00022, 0.000209, 0.000118, 0.000144, 0.00021, 2.19,2.55, 2.56]

Как видите, данные по краям намного выше, чем данные в середине, т.е.две разные шкалы.Используя график поверхности Matlab (surf(test)), я могу выбрать фокусировку по краям, установив цветовую карту max на 2.6, и я получу: Фокус по краям .Это довольно хорошо показывает локальные различия по краям, но никаких различий в средней части не видно.

В качестве альтернативы я могу сфокусироваться на середине, установив максимум на 0.00025 и получу: Сосредоточиться насередина , которая показывает локальные различия по центру, но не по краям.Я действительно хотел бы объединить оба.Я много играл с colormapeditor, но пока не нашел удовлетворительного решения.

В идеале я бы разделил цветную полосу на две области: одна синяя область в диапазоне от 0 до 0.00023 (максимальное значение средней области) и вторая желтая область в диапазоне от 0.00023 до 2.59 (максимальное значение краевой области).В качестве альтернативы было бы возможно наложение обеих картинок (в 2D довольно просто, но я также хотел бы сделать это в 3D), но я предпочитаю решать это с помощью собственной цветовой шкалы.

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

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

С точки зрения фотографии с высоким динамическим диапазоном (HDR) то, что вы просите сделать, имеет название: Tonemapping.Там нет простого ответа о том, как решить эту проблему.Принятие логарифма ваших данных, как предположил Амос, отличный первый шаг.Это часто делается при просмотре спектров сигналов высокого динамического диапазона (например, спектра мощности изображения), где он в целом работает из-за статистической связи между спектром мощности и естественными изображениями.

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

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

С учетом сказанного, существуют полностью автоматические подходы, некоторые из которых реализованы в Matlab.Вот тот, который я никогда не пробовал сам, но поддерживал mathworks .

0 голосов
/ 21 сентября 2018

Вместо этого вы можете построить журнал ваших данных, например,

surf(log(test))
caxis(log([min(test(:)) max(test(:))]));
colorbar_array = linspace(log(min(test(:))), log(max(test(:))), 5);
colorbar('FontSize',11,'YTick',colorbar_array,'YTickLabel',exp(colorbar_array));

Редактировать: вам все равно придется возиться с редактором цветовых карт, чтобы получить различия в верхнем пределе разрешенного диапазона данных.(желтая область).

...