2

通过非 matlab/非本地工具 (GDAL) 以及本地工具 (geoimread) 的组合,我可以将 Sentinel-2A 数据提取为单个波段或作为采用 gdal 合并的 RGB 图像。我被困在使用

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注意到从doublefor转换为的重要性imshow

4

1 回答 1

0

几点...

  • 您提到这I是一个RGB 图像(即 N×M×3 数据)。如果是这种情况,[]参数 toimshow将无效。这仅适用于灰度图像显示的自动缩放。

  • 鉴于您列出的强度值范围(271 到 4349),我猜您正在处理一种uint16数据类型。由于此数据类型的最大值为 65535,因此您的图像数据仅涵盖该范围的下 16。这就是为什么您的图像看起来几乎是黑色的原因。它还解释了为什么您可以使用给定代码查看信号:您在使用显示它之前应用swapbytes,在这种情况下,这会将值转移到更高的强度范围(例如,给出 的值)。Iimageswapbytes(uint16(4349))64784

为了更好地可视化您的数据,您需要对其进行缩放。作为一个简单的测试,您可能只需将其缩放 8 即可看到出现的内容(以覆盖动态范围的一半多一点):

imshow(8.*I);
于 2019-05-30T18:48:48.623 回答