Сюжет настоящего цвета Sentinel-2A в Matlab - PullRequest
2 голосов
/ 30 мая 2019

С помощью комбинации инструментов, не относящихся к 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, я получаю сходство с областью, которую я исследую (хотя и очень странного цвета)

В настоящее время я думаю, стоит ли мне попробовать:

  1. Найти низкоуровневое описание данных Sentinel-2A, выполнить масштабирование / коррекцию

  2. Использовать набор инструментов, возможно, этот.

  3. Возможно, отрегулируйте настройки вывода на одном из предыдущих этапов, связанных с 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 Ответ

0 голосов
/ 30 мая 2019

Пара очков ...

  • Вы упомянули, что I - это RGB-изображение (т.е. данные N-by-M-by-3),В этом случае аргумент [] для imshow не будет иметь никакого эффекта.Это применимо только к автоматическому масштабированию дисплея для оттенков серого изображений .

  • С учетом диапазона значений интенсивности, которые вы перечисляете (от 271 до 4349),Я предполагаю, что вы имеете дело с типом данных uint16.Поскольку этот тип данных имеет максимальное значение 65535, ваши данные изображения покрывают только нижнюю 16 th этого диапазона.Вот почему ваше изображение выглядит практически черным.Это также объясняет, почему вы можете видеть сигнал с вашим заданным кодом: вы применяете swapbytes к I перед отображением его с помощью image, что в этом случае будет сдвигать значенияв более высокие диапазоны интенсивности (например, swapbytes(uint16(4349)) дает значение 64784).

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

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