Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 为什么我不能用matlab中的这个短代码获得蓝色、绿色或红色通道?_Image_Matlab_Image Processing - Fatal编程技术网

Image 为什么我不能用matlab中的这个短代码获得蓝色、绿色或红色通道?

Image 为什么我不能用matlab中的这个短代码获得蓝色、绿色或红色通道?,image,matlab,image-processing,Image,Matlab,Image Processing,当我把这个图像是灰色的,不是绿色、蓝色或红色。为什么会这样? 我做错什么了吗?图像是灰色的,因为您只查看一种颜色的值,MATLAB看到一种颜色的值,但它无法知道它是什么颜色,这就是为什么它显示灰色 例如,值154是什么颜色?当您仅将一个值矩阵传递到imshow中时,它将以灰度显示 imshow(rgb(:,:,1));%以灰色显示图像的红色分量的值 rgb = imread('peppers.png'); imshow(rgb(:,:,1)); 执行上述操作将允许您查看颜色大小在其自身颜色值中

当我把这个图像是灰色的,不是绿色、蓝色或红色。为什么会这样?

我做错什么了吗?

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

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

imshow(rgb(:,:,1));%以灰色显示图像的红色分量的值

rgb = imread('peppers.png');
imshow(rgb(:,:,1));
执行上述操作将允许您查看颜色大小在其自身颜色值中的表示

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

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


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

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

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

如果只给
imshow
输入
peppers(:,:,1)
,则只给它一个
NxMx1
矩阵,imshow将其解释为灰度,请参阅

如果确实需要,可以更改颜色贴图以将灰度图像更改为红色:

peppers = imread('peppers.png');
onlyred_peppers = peppers;
onlyred_peppers(:,:,2:3)=0;
imshow(onlyred_peppers);
这将为您提供与上面相同的图像

如果还希望缩放加载图像中的颜色范围,以使用完整的可用范围(0-1/0-255),则可以使用以下方法:

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

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

因此,我认为我需要指定的颜色映射。我需要告诉他0是蓝色的,255是白色的。谢谢,我想我需要发布其他问题如何做到这一点。O.OThankyou@user1792426不,那是不正确的…等一分钟,我会在答案上贴个便条。我想这是因为如果一个即时通讯(:,:,2:3)=0;imshow(im);这是正确的展示。唯一的区别是颜色的映射。我想…@user1792426你是对的,我一定没有理解你的第一句话。我更新了答案,以反映如何获得r、g和b图像(以各自的颜色)。谢谢,但我知道这一点。我只是不知道是不是因为颜色的地图。@NominSim说区别不在于我在等他的便条。谢谢你看我的最后一句话,我还将添加一些关于更改颜色的内容。是的,我也想出了这个解决方案。但是使用colormap的问题是,你可以跳转颜色,例如我这样做:colormap([[0:1/255:1]”,零(256,1),零(256,1)],所以我的颜色步长是1/255,但可能是蓝色、绿色或红色的真实图像,其颜色差异小于1/255。这取决于你加载的图像,类型
double
将假定通道强度介于0和1之间,类型
uint
为0到255。出于这个原因,仅仅处理原始图像是最好的。我认为您的意思是,您希望缩放总颜色范围以使用总可用比例,即如果图像包含颜色值0-200,请将其缩放为显示为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)]);