【问题标题】:Converting a RGB image to grayscale based on the intensity of one color channel [duplicate]根据一个颜色通道的强度将RGB图像转换为灰度[重复]
【发布时间】:2016-11-29 02:56:17
【问题描述】:

我正在处理与此类似的图像:a cell image,并且我只想提取红粉色部分。截至目前,我正在使用img(:,:,1) 提取红色值,但这会产生二进制图像。我想知道是否有一种方法可以提取“红色”值并根据它们的“红色”程度或强度生成灰度图像。任何帮助都是极好的。

【问题讨论】:

  • 它不应该产生二进制图像。为什么你认为它是二进制的?试试imagesc(img(:,:,1))

标签: matlab image-processing rgb grayscale hsv


【解决方案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;

这是结果的子图:

此外,您应该知道,生成灰度图像的“简单”方式并不能保留人眼感知的颜色“亮度”,因为“绿色”与“红色”和“蓝色”的强度相同'实际上会被人眼感知为更亮,同样,'red' 比 'blue' 更亮。 Matlab 提供了一个rgb2gray 函数,该函数将 rgb 图像转换为正确保留亮度的灰度图像。这与您的红色、绿色和蓝色转换无关,但对于“粉色到灰度”图像可能需要考虑。例如,比较下面的两张图片,您会看到细微的对比度差异。

>> F_pinktogray_naive = mean(F(:,:,[1,3]), 3);
>> F_pinktogray_luminance = rgb2gray(F_pink);

两者的子图:

从某种意义上说,您可能更关心左(幼稚)的,因为您不关心“视觉上”将粉红色转换为灰色,但您更关心红色和蓝色荧光“在灰度图像上的强度方面具有可比性”(因为它们代表测量而不是视觉场景)。但在将 rgb 图像转换为灰度图像时,请牢记这一重要区别。

【讨论】:

  • 抱歉,澄清一下,底部图像是灰度图像,只是用“热”图可视化,我认为这会产生比灰色颜色图更直观的图像。此外,图像是使用imagesc 生成的,这意味着值是按比例缩放的(即最低变为 0,最高变为 1)。如果您不关心缩放,有一些方法可以解决这个问题(例如,根据上面的答案,imshow 允许您指定这样的限制;或者您可以简单地将灰度通道复制到所有 rgb 通道,这样您就有一个“灰色' rgb 图像,因此 imagesc 不会缩放,但会将它们解释为 rgb)。
【解决方案2】:

您可能会使用imshow 可视化结果,这会自动将坐标区的颜色限制设置在01 之间。您的图像是 RGB 并且红色通道的值范围从 0255。因此,如果您只为imshow 指定一个输入,您将获得一个图像,其中所有值 > 1 将显示为白色,所有零值将显示为黑色。所以你的图像并不是真正的二进制,它只是以这种方式显示

您希望使用imagesc 显示您的图像,这将自动缩放颜色限制以匹配您的数据:

imagesc(img(:,:,1));
colormap gray

或者您可以指定imshow 的第二个输入,使其也可以缩放以适合您的数据范围:

imshow(img(:,:,1), [])

在可视化所有通道时这不是问题的原因是,如果您指定红色、绿色和蓝色通道,这将被视为真彩色图像,所有坐标轴颜色限制都将被忽略。

【讨论】:

    【解决方案3】:

    您捕获的数据将是正确的(并且是灰度的),但可视化可能不正确。当尝试可视化二维矩阵时(与您的结果 img(:,:,1) 相同),matlab 应用默认颜色图,结果为:

    [x,y]=meshgrid(1:200, 1:200);
    z=x.^2.*sin(y/max(y(:))*pi);
    figure;imagesc(z);
    

    如果您想避免应用jet 颜色图,请更改颜色图:

    colormap('gray')
    

    或将您的 2D 矩阵更改为 3D 矩阵,明确指定要显示的颜色(必须是 0 到 1 之间的值):

    z3d = z(:,:,[1 1 1]); % more efficient than repmat
    z3d = (z3d - min(z(:)))./range(z(:)); % make sure values in range [0; 1]
    

    您会在颜色图版本中看到条带,因为默认情况下颜色图 contains 64 different colors; 3d矩阵版没有这个问题,直接显示颜色。

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 2010-10-15
      • 2018-03-29
      • 2014-02-26
      • 2014-12-22
      • 2014-10-31
      • 1970-01-01
      相关资源
      最近更新 更多