我有一个问题,在提取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的文件可以工作,而在应用程序中,我观察到了频谱,并对其进行了播放。我在这里不明白什么意思?有解决办法吗?您可以通过此链接找到PaviaU.mat文件中的变量为paviaU
发布于 2022-10-13 21:09:43
正如所评论的,在MATLAB中,RGB图像的范围应该是0,1。
除以最大值是将范围转换为0,1的简单方法。
rgbImage = rgbImage / max(rgbImage(:));
当单通道图像显示为灰度时,我们可以使用imshow(I, [])
。
为了检查像素值,我们可以在impixelinfo
之后添加imshow
(我们也可以添加标题):
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
图像:
https://stackoverflow.com/questions/74058014
复制相似问题