Matlab 基于一个颜色通道的强度将RGB图像转换为灰度
我正在处理与此类似的图像:,我只想提取红色和粉红色的部分。到目前为止,我正在使用Matlab 基于一个颜色通道的强度将RGB图像转换为灰度,matlab,image-processing,rgb,grayscale,hsv,Matlab,Image Processing,Rgb,Grayscale,Hsv,我正在处理与此类似的图像:,我只想提取红色和粉红色的部分。到目前为止,我正在使用img(:,:,1)提取红色值,但这会生成一个二进制图像。我想知道是否有一种方法可以提取“红色”值,并根据它们的“红色”程度或强度生成灰度图像。任何帮助都会很棒 您捕获的数据将是正确的(并且是灰度的),但是可视化可能不正确。当尝试可视化2D矩阵(与结果img(:,:,1)相同)时,matlab应用默认颜色贴图,结果为: [x,y]=meshgrid(1:200, 1:200); z=x.^2.*sin(y/max(y
img(:,:,1)
提取红色值,但这会生成一个二进制图像。我想知道是否有一种方法可以提取“红色”值,并根据它们的“红色”程度或强度生成灰度图像。任何帮助都会很棒 您捕获的数据将是正确的(并且是灰度的),但是可视化可能不正确。当尝试可视化2D矩阵(与结果img(:,:,1)
相同)时,matlab应用默认颜色贴图,结果为:
[x,y]=meshgrid(1:200, 1:200);
z=x.^2.*sin(y/max(y(:))*pi);
figure;imagesc(z);
如果要避免应用的jet
colormap,请更改colormap:
colormap('gray')
或者将2D矩阵更改为3D矩阵,明确指定要显示的颜色(值必须介于0和1之间):
您可以在colormap版本中看到条带,因为默认情况下是colormap;3d矩阵版本没有这个问题,因为它直接显示颜色。您可能正在使用
imshow
可视化结果,它将自动将轴的颜色限制设置在0
和1
之间。您的图像是RGB,红色通道的值范围为0
到255
。因此,如果只为imshow
指定一个输入,您将得到一个图像,其中所有值>1
将显示为白色,所有零值将显示为黑色。所以你的图像不是真正的二值图像,只是看起来是这样的
您希望使用imagesc
显示图像,该图像将自动缩放颜色限制以匹配您的数据:
imagesc(img(:,:,1));
colormap gray
或者,您可以将第二个输入指定给imshow
,使其也可以缩放以适应您的数据范围:
imshow(img(:,:,1), [])
当您可视化所有通道时,这不是问题的原因是,如果您指定红色、绿色和蓝色通道,这将被视为真彩色图像,并且忽略所有轴的颜色限制。如果我可以补充您的问题,在我看来,您只是试图隔离和可视化红色、绿色,和蓝色氟化物单独(或组合)。我特别认为这是因为你提到了“粉红” 最好只隔离通道:
>> F_red = F; F_red(:,:,[2,3]) = 0;
>> F_green = F; F_green(:,:,[1,3]) = 0;
>> F_blue = F; F_blue(:,:,[1,2]) = 0;
>> F_pink = F; F_pink(:,:,2) = 0;
下面是结果的一个子图:
此外,您应该知道,生成灰度图像的“天真”方式并不能保持人眼感知的颜色“亮度”,因为与“红色”和“蓝色”强度相同的“绿色”实际上会被人眼感知为更亮,同样,“红色”比“蓝色”更亮。Matlab提供了一个rgb2gray
函数,该函数将rgb图像转换为正确保持亮度的灰度图像。这与您的纯红色、绿色和蓝色转换无关,但对于“粉色到灰度”图像,可能需要考虑这一点。例如,比较下面的两幅图像,您将看到细微的对比度差异
>> F_pinktogray_naive = mean(F(:,:,[1,3]), 3);
>> F_pinktogray_luminance = rgb2gray(F_pink);
二者的一个子地块:
从某种意义上说,您可能更关心左侧(幼稚的)透视图,因为您不关心“视觉”将粉色透视图转换为灰色透视图,而是更关心红色和蓝色透视图在灰度图像上的强度是否“可比”(因为它们代表的是测量值,而不是视觉场景)。但在将rgb图像转换为灰度时,这是一个重要的区别。它不应该生成二值图像。你为什么认为它是二进制的?请尝试
imagesc(img(:,:,1))
抱歉,要澄清的是,底部图像是灰度图像,只是通过“热”贴图进行可视化,我认为这会产生比灰度颜色贴图更直观的图像。此外,图像是用imagesc
生成的,这意味着值是按比例缩放的(即最低值变为0,最高值变为1)。如果您不喜欢缩放,有很多方法可以解决这个问题(例如,imshow允许您根据上面的答案指定此类限制;或者您可以简单地将灰度通道复制到所有r.g.b.通道,这样您就有一个“灰色”rgb图像,因此imagesc不会缩放,但会将其解释为rgb)。
>> F_pinktogray_naive = mean(F(:,:,[1,3]), 3);
>> F_pinktogray_luminance = rgb2gray(F_pink);