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

时间:2015-05-04 03:54:56

标签: image-processing rgb hsv

我必须在含有另一种血细胞的图像中检测白细胞,但可以通过细胞的颜色来区分,白细胞有更浓的紫色,可以在下图中看到。

我使用RGB / HSV的颜色方法是什么?为什么?!

示例图片:

Blood cells image

2 个答案:

答案 0 :(得分:13)

通常在做出这样的决定时,我会快速绘制不同的通道和颜色空间,看看我发现了什么。从高质量的图像开始总是比从低图像开始更好并尝试通过大量处理来修复它

在这个特定情况下,我会使用HSV。但与大多数颜色分割不同,我实际上会使用饱和通道来分割图像。细胞几乎是相同的Hue,因此使用色调通道将非常困难。

色调(完全饱和度和全亮度)非常难以区分细胞

enter image description here

饱和度巨大的对比

enter image description here

绿色频道,实际上也显示出很多对比度(让我感到惊讶)

enter image description here

红色和蓝色通道难以真正区分细胞。

现在我们有两个候选表示饱和度或绿色通道,我们问哪个更容易使用?由于任何HSV工作都涉及我们转换RGB图像,我们可以忽略它,因此明确的选择是简单地使用RGB图像的绿色通道进行分割。

修改

因为你没有包含语言标签,所以我想附上我刚写的一些Matlab代码。它在所有4个颜色空间中显示图像,因此您可以快速做出明智的决定。它模仿matlabs Color Thresholder颜色空间选择窗口

printT = function(t)
   t = t:view(-1)
   for i=1,t:nElement() do
      io.write(t[i] .. ',')
   end
end

printT(mlp:get(1).weight)
printT(mlp:get(1).bias)

printT(mlp:get(3).weight)
printT(mlp:get(3).bias)

printT(mlp:get(5).weight)
printT(mlp:get(5).bias)
你可以这样称呼

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

,显示就是这个

enter image description here

答案 1 :(得分:3)

DIP中的

和CV这是一个有效的问题

但它没有普遍的答案,因为每项任务都是独特的,所以使用更适合它的东西。要正确选择,你需要知道每个的利弊,所以这里有一些总结:

  1. <强> RGB

    这很容易处理,您可以轻松访问r,g,b波段。对于许多情况来说,最好只检查单个波段而不是整个颜色,或者混合颜色以强调所需的功能,甚至可以抑制不需要的功能。由于直接编码成带的强度,很难比较RGB中的颜色。要解决这个问题,你可以使用规范化,但这很慢(需要每像素sqrt)。你可以直接在RGB颜色上做算术。

    更适合RGB的任务示例:

  2. <强> HSV

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

    更适合HSV的任务示例:

    看看:

    在HSV中看到明显的颜色分离。基于颜色的图像分割在HSV上很容易。您不能直接对HSV颜色进行算术,而是需要转换为RGB并返回