在matlab中读取灰度图像

时间:2016-07-19 21:05:39

标签: matlab

我有灰度图像“lena.bmp”。我想在matlab中使用imread()函数读取这个图像。 当我使用下面的代码阅读并显示图像时,我的图像是黑色(黑色)。

    img = imread('lena.bmp');
    imshow(img);

但是当我使用下面的代码时,我没有问题可以查看。

    [img map]= imread('lena.bmp');
    imshow(img,map);

似乎我的第一个代码没有在灰度模式下读取图像(就像rgb2gray函数生成的那样)。

我的图片如下:

enter image description here

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

您的图片是“已编入索引”的图片。这意味着它包含的整数值比任何东西都更像“标签”,并且每个标签都映射到一种颜色(即rgb三元组)。您的map变量代表该映射;在第5行,你有rgb三元组,例如对应于'label'“5”。

要了解我的意思,请执行unique(img),您会发现img数组的值实际上非常规律。命令rgbplot可以图形方式显示实际的colourmap。在地图变量上运行rgbplot(map)以查看每种红绿色和蓝色的映射。

现在,保存并以img2的形式阅读计算机上方的图像并比较数组值。

enter image description here

此图像是通过使用照片编辑软件(GIMP)从您链接的“索引”图像转换为“灰度”图像而生成的。不同之处在于 在灰度图像中,像素值表示实际强度,而不是整数“标签”。 Imread默认将灰度图像读取为uint8图像,这意味着它将强度值分配给范围从0(黑色)到255(白色)的像素。由于这些值恰好是整数,因此您仍然可以作为“标签”进行欺骗并将其视为“标签”并强制对其进行颜色映射。但是如果你指定一个'线性地图'(即值1 =强度1,值2 =强度2等),那么你的图像看起来就像你期望的那样。

您会看到来自unique(img2)的值非常不同。如果您imshow(img2),您会看到这显示为您所期望的。如果你没有为imshow指定一个colormap,它将假设地图是从图像数组中的最低值到最高值的线性映射,这解释了为什么你的索引图像看起来很奇怪,因为它的值永远不应该对应强度。

另请尝试使用“当前”色彩映射表示imagesc(img2)的{​​{1}}。 imagesc导致色彩映射被“缩放”,因此最低颜色会转到图像中的最低值,同样也会达到最高值。 默认的色彩映射是jet所以你应该看到一个迷幻的图像,但你应该能够清楚地看出lena。如果您尝试colormap gray,您应该再次看到灰色版本。另请尝试colormap hot。现在要了解色彩映射,请尝试使用rgbplot命令(例如rgbplot(gray)rgbplot(hot)等)。

因此,回到imshow,imshow基本上允许您显示索引图像,并指定要用于显示它的颜色图。如果未指定色彩映射,则只使用从最低值到最高值的线性插值作为地图。因此,imshow(img)将以与带有灰色色彩图的imagesc(img)相同的方式显示图像。由于您的第一个img中的值代表均匀间隔的“标签”而非实际强度,因此您将获得垃圾图片。

编辑:如果您想将索引图像转换为灰度图像,则matlab会提供ind2gray函数,例如:

[img, map] = imread('lena.bmp');
img_gray = ind2gray(img, map);

如果你想将像素值作为强度处理,这可能就是你所需要的。