我有灰度图像“lena.bmp”。我想在matlab中使用imread()函数读取这个图像。 当我使用下面的代码阅读并显示图像时,我的图像是黑色(黑色)。
img = imread('lena.bmp');
imshow(img);
但是当我使用下面的代码时,我没有问题可以查看。
[img map]= imread('lena.bmp');
imshow(img,map);
似乎我的第一个代码没有在灰度模式下读取图像(就像rgb2gray函数生成的那样)。
我的图片如下:
我该怎么做才能解决这个问题?
答案 0 :(得分:3)
您的图片是“已编入索引”的图片。这意味着它包含的整数值比任何东西都更像“标签”,并且每个标签都映射到一种颜色(即rgb三元组)。您的map
变量代表该映射;在第5行,你有rgb三元组,例如对应于'label'“5”。
要了解我的意思,请执行unique(img)
,您会发现img
数组的值实际上非常规律。命令rgbplot
可以图形方式显示实际的colourmap。在地图变量上运行rgbplot(map)
以查看每种红绿色和蓝色的映射。
现在,保存并以img2
的形式阅读计算机上方的图像并比较数组值。
此图像是通过使用照片编辑软件(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);
如果你想将像素值作为强度处理,这可能就是你所需要的。