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