我应该使用 HSV/HSB 还是 RGB?为什么?

5

我需要在一个含有其他血细胞的图像中检测白细胞,但是通过细胞的颜色可以区分它们之间的差异,白细胞具有更密集的紫色,可以在下面的图像中看到。

我应该使用什么颜色方法,RGB / HSV?为什么?!

示例图像:

Blood cells image

2个回答

14
通常在做这样的决策时,我会快速绘制不同的通道和颜色空间,看看我能找到什么。始于高质量的图像总比用大量处理修复低质量的图像要好。
在这种特定情况下,我会使用HSV。但与大多数颜色分割不同,我实际上会使用饱和度通道来分割图像。细胞的色调几乎相同,因此使用色调通道将非常困难。
色调(在完全饱和度和光亮度下)非常难以区分细胞。

enter image description here

饱和度巨大的对比度

enter image description here

绿色通道实际上也显示了很多对比度(这让我感到惊讶)

enter image description here

红色和蓝色通道很难区分细胞。
现在我们有两个候选表示,饱和度或绿色通道,我们问哪一个更容易使用?由于任何HSV工作都涉及将RGB图像转换,因此我们可以忽略它,所以明显的选择是仅使用RGB图像的绿色通道进行分割。
编辑
由于您没有包含语言标签,我想附上我刚刚编写的Matlab代码。它在所有4种颜色空间中显示图像,因此您可以快速做出明智的决定。它模仿了matlabs Color Thresholder颜色空间选择窗口。
function ViewColorSpaces(rgb_image)
    % ViewColorSpaces(rgb_image)
    % displays an RGB image in 4 different color spaces. RGB, HSV, YCbCr,CIELab
    % each of the 3 channels are shown for each colorspace
    % the display mimcs the  New matlab color thresholder window
    % http://www.mathworks.com/help/images/image-segmentation-using-the-color-thesholder-app.html

    hsvim = rgb2hsv(rgb_image);
    yuvim = rgb2ycbcr(rgb_image);

    %cielab colorspace
    cform = makecform('srgb2lab');
    cieim = applycform(rgb_image,cform);

    figure();
    %rgb
    subplot(3,4,1);imshow(rgb_image(:,:,1));title(sprintf('RGB Space\n\nred'))
    subplot(3,4,5);imshow(rgb_image(:,:,2));title('green')
    subplot(3,4,9);imshow(rgb_image(:,:,3));title('blue')

    %hsv
    subplot(3,4,2);imshow(hsvim(:,:,1));title(sprintf('HSV Space\n\nhue'))
    subplot(3,4,6);imshow(hsvim(:,:,2));title('saturation')
    subplot(3,4,10);imshow(hsvim(:,:,3));title('brightness')

    %ycbcr / yuv
    subplot(3,4,3);imshow(yuvim(:,:,1));title(sprintf('YCbCr Space\n\nLuminance'))
    subplot(3,4,7);imshow(yuvim(:,:,2));title('blue difference')
    subplot(3,4,11);imshow(yuvim(:,:,3));title('red difference')

    %CIElab
    subplot(3,4,4);imshow(cieim(:,:,1));title(sprintf('CIELab Space\n\nLightness'))
    subplot(3,4,8);imshow(cieim(:,:,2));title('green red')
    subplot(3,4,12);imshow(cieim(:,:,3));title('yellow blue')

end

你可以这样调用它

rgbim = imread('http://i.stack.imgur.com/gd62B.jpg');
ViewColorSpaces(rgbim)

而显示结果是这样的

enter image description here


谢谢您的回答,很容易理解。但是,您能否请解释一下每个通道中的(:,:,1/2/3)吗? 我知道它是用于分割通道的,但实际上它是如何工作的呢? 并且它是否适用于所有图像示例,只需调整饱和度值即可?还是有时需要修改色相和亮度?抱歉,我是数字图像处理的初学者。 - Jaja
在Matlab中,彩色图像通常是MxNxL的格式,其中M=#行 N=#列 L=#颜色通道。冒号:表示所有。因此,当我拆分一幅图像时,我会说rgb_image(:,:,1),这意味着(所有行,所有列,第1个通道)。对于RGB颜色空间,我们已经知道通道1=红色,2=绿色,3=蓝色。其他颜色空间也有它们各自的含义。如果您查看我的输出图像,每个图像都有一个标题,说明它所代表的数据。希望这能帮到您。 - andrew
非常感谢,这非常有帮助。 哦,为什么你的示例图像变成了灰度? 你有没有任何建议的工具,可以用任何方法查看颜色通道,并且我可以随意更改其值,就像在Photoshop中一样,但在Photoshop中只有RGB通道。 - Jaja
图像是灰度的,因为它们只有一个通道。请记住索引“(:,:,1/2/3)”表示仅显示一个通道。我们将MxNxL图像转换为MxNx1。当Matlab只看到一个通道时,它会自动以灰度显示。在Matlab中没有简单的方法可以正确地显示所有颜色通道。我不知道任何软件可以让您查看正确颜色空间中的颜色。大多数软件只能让您查看RGB,但没有其他选项。抱歉。 - andrew

3

在数字图像处理和计算机视觉中,这总是一个有效的问题

但它没有普遍的答案,因为每个任务都是独特的,所以使用更适合它的工具。要正确选择,您需要了解每种方法的优缺点,以下是一些摘要:

  1. RGB

    易于处理,可以轻松访问r,g,b通道。对于许多情况来说,仅检查单个通道而不是整个颜色或混合颜色以强调所需功能甚至减弱不需要的功能更好。由于亮度直接编码到通道中,因此很难比较RGB颜色。为了解决这个问题,您可以使用标准化,但这很慢(需要每像素sqrt)。您可以直接对RGB颜色进行算术运算。

    适合使用RGB的示例:

  2. HSV

    更适用于颜色识别,因为使用HSV的CV算法与人类视觉感知非常相似,因此如果想要识别具有不同颜色区域,则HSV更好。 RGB / HSV之间的转换需要一些时间,这可能对于大分辨率或高fps应用程序是问题。对于标准的数字图像处理和计算机视觉任务,通常不会出现此情况。

    适合使用HSV的示例:

    请参见:

    以查看HSV中的明显颜色分离。基于颜色的图像分割在HSV上很容易。您不能直接对HSV颜色进行算术运算,而是需要先将其转换为RGB,然后再转回。


那么这两种颜色模型都可以在我的情况下使用吗? 但是对于我的情况来说,HSV比RGB更好,因为我需要一种可以被人眼/感知区分的颜色识别,对吧? - Jaja
@Jaja 是的,看起来是这样。 - Spektre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接