Сюжет настоящего цвета Sentinel-2A в Matlab
С помощью комбинации инструментов не-matlab/non-native (GDAL), а также нативных инструментов (geoimread) я могу получать данные Sentinel-2A либо по отдельным полосам, либо как RGB-изображение, используя слияние gdal. Я застрял в точке, где с помощью
imshow(I, [])
Создает черное изображение без видимого сигнала. Диапазон значений интенсивности на изображении составляет 271 - 4349. Я знаю, что на изображении хороший сигнал, потому что, когда я делаю:
bit_depth = 2^15;
I = swapbytes(I);
[I_indexed, color_map] = rgb2ind(I, bit_depth);
I_double = im2double(I_indexed, 'indexed');
ax1 = figure;
colormap(ax1, color_map);
image(I_double)
то есть индексировать изображение, собрать цветовую карту, установить цветовую карту и затем вызвать image
функция, я получаю сходство с регионом, который я исследую (хотя и очень странным цветом)
В настоящее время я думаю, стоит ли мне попробовать:
Найти низкоуровневое описание данных Sentinel-2A, выполнить масштабирование / коррекцию
Используйте набор инструментов, возможно, этот.
Возможно, отрегулируйте настройки вывода на одном из предыдущих этапов, связанных с комментариями или предложениями GDAL.
Базовая схема масштабирования:
% convert image to double
I_double = im2double(I);
% scaling
max_intensity = max(I_double(:));
min_intensity = min(I_double(:));
range_intensity = max_intensity - min_intensity;
I_scaled = 2^16.*((I_double - min_intensity) ./ range_intensity);
% display
imshow(uint16(I_scaled))
отмечая важность кастинга в uint16
от double
за imshow
,
1 ответ
Пара очков...
Вы упоминаете, что
I
является RGB-изображением (то есть данные размером N × M × 3). Если это так, то[]
аргументimshow
не будет иметь никакого эффекта. Это относится только к автоматическому масштабированию дисплея для изображений в градациях серого.Учитывая диапазон значений интенсивности, которые вы перечисляете (от 271 до 4349), я предполагаю, что вы имеете дело с
uint16
тип данных. Поскольку этот тип данных имеет максимальное значение 65535, данные вашего изображения покрывают только нижнюю шестнадцатую этого диапазона. Вот почему ваше изображение выглядит практически черным. Это также объясняет, почему вы можете увидеть сигнал с вашим данным кодом: вы подаете заявкуswapbytes
вI
перед отображением сimage
что в этом случае сместит значения в более высокие диапазоны интенсивности (например,swapbytes(uint16(4349))
дает значение64784
).
Чтобы лучше визуализировать ваши данные, вам нужно их масштабировать. В качестве простого теста вы, вероятно, сможете увидеть что-то, просто масштабируя его на 8 (чтобы охватить чуть больше половины вашего динамического диапазона):
imshow(8.*I);