【问题标题】:Imshow in Matlab returns black image [duplicate]Matlab中的Imshow返回黑色图像[重复]
【发布时间】:2021-12-15 15:55:17
【问题描述】:

我想显示一张卫星图像(16 位),其中包含 4 个强度级别的波段:红色、绿色、蓝色和 nir。但是,我只想显示前 3 个波段。我使用以下代码:

RGB=imread('IMG_PHR1B_MS_202106020751594_ORT_5893575101-2_R1C1.TIF');
subset_RGB=RGB(1550:3238,343:1250,1:3);
figure(1)
imshow(subet_RGB)
impixelinfo

像素显示明显不同的值,但图像是完全黑色的。 值范围:

红色:473-4152

绿色:599-4256

蓝色:507-3737

我将此图像转换为 HSV(因为我也需要它)。

normal=im2double(subset_RGB);
hsv=rgb2hsv(normal);
imshow(hsv)

此图像确实会生成彩色图像。 我可能认为这是因为 hsv 是双倍的,而 subset_RGB 是 16 位的。所以我尝试了以下方法:

test=im2double(subset_RGB)
imshow(test)

我也按照建议尝试了 imagesc,但结果是黑色图像:

figure(2)
imagesc(subset_RGB)

如何以真彩色显示原始图像?

【问题讨论】:

  • 你图片中像素值的范围是0到255吗?
  • 试试imagesc?这会在显示之前缩放图像。
  • 我用两种建议编辑了帖子。
  • 使用imshow(subet_RGB,[])
  • 根据此处的文档:mathworks.com/help/matlab/ref/… 您的颜色三元组值应在 [0 255] 范围内,但您说您的值范围远远超出该范围。他们以后会扩大规模吗?

标签: matlab rgb satellite


【解决方案1】:

要使用imshow 显示 RGB 图像,您必须将其从 0 重新缩放到 255。我不知道您的图像的原始位深度是多少(即使它以 16 位保存,实际位深度可能更小)。我假设它是 13 位,因为它是您显示的值的下一个 2 的幂。

rescaled_img = uint8(double(subset_RGB) / (2^(13-8)));
imshow(rescaled_img);

请注意,如果位深度错误,颜色可能会关闭或太暗。另一种方法是除以8192,而是除以图像中的最大值。在这种情况下,请使用:

rescaled_img = uint8(256 * double(subset_RGB) / max(subset_RGB, [], 'all'));
imshow(rescaled_img);

【讨论】:

  • 正确,已修复!
猜你喜欢
  • 2019-06-21
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2020-11-01
  • 2015-09-12
相关资源
最近更新 更多