如何在MatLab中将高光谱图像转换为RGB

7y4bm7vi  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(797)

我有一个问题,提取3个波段下的名称R,G和B,然后使用这些波段作为3个颜色通道的RGB图片。这是一张高光谱图像,它有103个波段,而正常的RGB图像只有3个波段。给我这个问题的那个人把它描述为非常基本的东西,然而,我对它有一段非常困难的时间。我可能对MatLab有语法问题。这张图片以.mat文件的形式出现。大小为610x340x103。我使用了不同的代码,搜索了论坛等,但我失败了。这是我上次尝试的代码。

load("PaviaU.mat")
Blue=paviaU(:,:,7);
imwrite(Blue,"Blue.jpg")
newBlue=imread("Blue.jpg");
imshow(newBlue)
imagesc(newBlue) %*this line gives the result as a scaled image*

Green=paviaU(:,:,21);
imwrite(Green,"Green.jpg")
newGreen=imread("Green.jpg");
imshow(newGreen)

Red=paviaU(:,:,53);
imwrite(Red,"Red.jpg")
newRed=imread("Red.jpg");
imshow(newRed)

rgbImage = paviaU(:,:,[newRed,newGreen,newBlue])

当我使用imagesc(Red)而不是imshow时,我看到了图片,但这不是我想看到的。此外,我在MatLab的App部分分析了这个.mat文件,其中有一个高光谱图像应用程序,由于缺乏波段信息,我无法观察到光谱。但是,我觉得在图像处理库里面有一个文件,它的名字是paviaU.dat,这个文件是可以工作的,在App里面,我观察了频谱,玩了一下。我在这里不明白的是什么?有什么解决办法吗?您可以通过链接PaviaU.mat找到内部变量为paviaUPaviaU.mat文件

oo7oh9g9

oo7oh9g91#

正如所评论的,在MatLab中,RGB图像的范围应该是0,1
除以最大值是将范围转换为0,1的简单方法。

rgbImage = rgbImage / max(rgbImage(:));

当将单通道图像显示为灰度时,我们可以使用imshow(I, [])
为了检查像素值,我们可以在imshow之后添加impixelinfo(我们也可以添加标题):

figure;
imshow(Blue, []);
title('Blue');
impixelinfo

RGB图像看起来很暗,可能是因为图像是在未进行Gamma校正的情况下捕获的。
为了应用伽玛校正,根据sRGB标准,我们可以使用lin2rgb函数:

srgbImage = lin2rgb(rgbImage);

代码示例:

load("PaviaU.mat")

Blue = paviaU(:,:,7);
figure;imshow(Blue, []);title('Blue');impixelinfo

Green = paviaU(:,:,21);
figure;imshow(Green, []);title('Green');impixelinfo

Red = paviaU(:,:,53);
figure;imshow(Red, []);title('Red');impixelinfo

rgbImage = cat(3, Red, Green, Blue); % Concatenate Red, Green and Blue channels.
rgbImage = rgbImage / max(rgbImage(:)); % Convert to range [0, 1]

figure;imshow(rgbImage);title('rgbImage');impixelinfo

srgbImage = lin2rgb(rgbImage); % Apply Gamma correction.
figure;imshow(srgbImage);title('srgbImage');impixelinfo

srgbImage = im2uint8(srgbImage); % Convert from double in range [0, 1] to uint8 in range [0, 255] (optional).
imwrite(srgbImage, 'srgbImage.png'); % Save image for testing.

输出srgbImage图像:

相关问题