MATLAB读取BMP图像不正确。

4
我有一张灰度图像。
当我在MATLAB中加载它时,我发现灰度级别与原始图像不匹配。MATLAB读入的图像比原始图像更亮。我做错了什么?如何解决?
左边是MATLAB读取的,右边是原始的。

enter image description here

原始bmp文件可以在这里下载。

1个回答

5
原来你的图像与一个颜色映射相关联。当你使用X = imread('Lena.bmp');读取时,你读取的是一个索引图像。这意味着每个值都是一个指向颜色映射的索引 - 这与实际强度不同。
因此,要读取带有颜色映射的图像,然后将带有颜色映射的索引图像转换为实际图像。你需要调用imread的两个输出变量,然后使用ind2rgb相应地转换索引图像。
[X,map] = imread('Lena.bmp');
im = ind2rgb(X,map);
imshow(im);

我获得了这张图片,与你的右侧图片相匹配:

enter image description here


将来,如果您不确定您的图片是否有一个颜色映射,请调用带有两个输出的变量,然后检查第二个包含颜色映射的输出是否非空。 如果是,则相应地调用“ind2rgb”:
[im, map] = imread('...'); %// Place your input image location here
if ~isempty(map)
    im = ind2rgb(im,map);
end

由于您的图像是灰度的,如果您想将其转换为单通道,请使用rgb2gray或从图像中提取任何通道。 灰度的工作方式是RGB图像中的每个通道完全相同。
因此:
im = rgb2gray(im); 
%// Or
%im = im(:,:,1);

该图像也将是double类型,因此要转换为uint8(最常见的类型),只需执行以下操作:
im = im2uint8(im);

在进行映射后,我该如何将RGB表转换为单通道灰度表? - ShineZero
@ShineZero 这些都是灰度图像,所以你可以使用 im = rgb2gray(im);,或者只提取一个通道:im = im(:,:,1);。无论哪种方式,结果都是一样的。我已经相应地编辑了我的答案。如果可以的话,请告诉我它是否有效! - rayryeng
还有一个小问题,我能把表格的值改为0~255吗? - ShineZero
只需执行 im = uint8(255*im);。或者如果您懒得这样做,可以使用 im = im2uint8(im); - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接