为什么我在matlab中使用这个短代码来获取蓝色,绿色或红色通道?

时间:2012-11-01 19:48:58

标签: image matlab image-processing

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

当我把它放在图像是灰色的,而不是绿色或蓝色或红色。那是为什么?
我做错了吗?

3 个答案:

答案 0 :(得分: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);

执行上述操作将允许您在自己的颜色值中查看颜色大小的表示。

答案 1 :(得分:5)

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

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

enter image description here

如果您仅imshow提供peppers(:,:,1),那么您只给它一个NxMx1矩阵,由imshow解释为灰度,请参阅here。< / p>

如果您真的需要,可以更改色彩图以将灰度图像更改为红色标尺:

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)]);

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

答案 2 :(得分:1)

RGB颜色模型通过以某种比例“混合”红色,绿色和蓝色来表示颜色。您需要知道的是颜色由3个数字表示。

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

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