Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Matlab 基于一个颜色通道的强度将RGB图像转换为灰度_Matlab_Image Processing_Rgb_Grayscale_Hsv - Fatal编程技术网

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