2
rgb = imread('peppers.png');
imshow(rgb(:,:,1));

当我把这个图像是灰色的,而不是绿色或蓝色或红色。这是为什么?
难道我做错了什么?

4

3 回答 3

6

图像是灰色的,因为您只查看一种颜色的值,MATLAB 看到一种颜色的值,但它无法知道它是什么颜色,这就是它显示灰色的原因。

例如,值 154 是什么颜色?当您仅将值矩阵传递给imshow它时,它将以灰度显示。

imshow(rgb(:,:,1)); %Shows the values of the red component of the image in grey

rgb = imread('peppers.png');
r = rgb;
r(:,:,2:3) = 0; % The red component without the other components
g = rgb;
g(:,:,1:2:3) = 0; % The green component without the other components
b = rgb;
b(:,:,1:2) = 0; % The blue component without the other components
figure();
imshow(r);
figure();
imshow(g);
figure();
imshow(b);

执行上述操作将使您能够以自己的颜色值查看颜色大小的表示。

于 2012-11-01T19:55:02.467 回答
5

如果只想显示一个颜色通道,请将其他颜色通道设置为零:

peppers = imread('peppers.png');
onlyred_peppers = peppers;
onlyred_peppers(:,:,2:3)=0;
imshow(onlyred_peppers);

在此处输入图像描述

如果你imshow只喂食peppers(:,:,1),你只是给它一个NxMx1矩阵,它被 imshow 解释为灰度,见这里

如果你真的想要,你可以更改颜色图以将灰度图像更改为红色:

imshow(peppers(:,:,1));
cm_red = [linspace(0,1,256)' zeros(256,2)];
colormap(cm_red);

这将为您提供与上面相同的图像。

如果您还想缩放您加载的图像中的颜色范围以使用完整的可用范围(0-1 / 0-255),您可以这样做:

red_scaled_peppers = peppers(:,:,1);
red_scaled_peppers = double(red_scaled_peppers)/double(max(red_scaled_peppers(:)));
imshow(red_scaled_peppers);
colormap([linspace(0,1,256)' zeros(256,2)]);

这没有什么区别,因为在这种情况下,红色通道颜色跨度已经达到最大值。

于 2012-11-01T20:10:14.707 回答
1

RGB颜色模型通过按一定比例“混合”红色、绿色和蓝色来表示颜色。您只需要知道颜色由 3 个数字表示。

因此,您的rgb图像由 3 个矩阵表示,其中rgb(:,:,1)表示红色层。现在,如果你看一下,rgb(:,:,1)你会看到一堆数字(可能在 0 - 255 或 0 - 1 之间)。

所以 elementrgb(i,j,1)代表像素处的红色分量(i,j)。因此,显示矩阵rgb(:,:,1)仅显示具有一堆值的矩阵,这些值显示为灰度(其中 0 = 黑色,255 = 白色)。

于 2012-11-01T19:55:07.377 回答