2015-05-04 251 views
4

我具有检测白细胞细胞包含其他血细胞的图像中的,但差异可以通过细胞的颜色区分开来,白细胞具有更致密的紫色的颜色,可以在下面的图像中可以看出。我应该使用HSV/HSB还是RGB?为什么?

我有什么颜色梅索德使用RGB/HSV?为什么?!

样本图像:

Blood cells image

回答

12

一般。从高质量图像开始比从低开始总是更好,并尝试用大量处理来修复它

在这个特定情况下,我会使用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

高质量的答案!工作很好。 –

+0

谢谢你的回答,这很容易理解.. 但是,你能解释一下(:,:,1/2/3)在每个渠道吗? 我明白这是分裂的渠道,但它是如何工作的呢? ,它会在所有与饱和度值相似的图像示例中工作吗?或者我有时会修改色调和亮度? 对不起,我是一个数字图像处理初学者 – Jaja

+0

在matlab中彩色图像通常是'MxNxL'其中'M =#行N =#列L =#颜色通道'冒号':'表示所有。所以当我分割一个图像时,我说'rgb_image(:,:1)'这意味着'(所有行,所有列,通道#1)'对于RGB色彩空间,我们已经知道通道1 =红色2 =绿色3 =蓝色。其他颜色空间也有意义。如果你看看我的输出图像,每个图像都有一个表示它所代表的数据的标题。我希望帮助 – andrew

2

在DIP和CV是这总是一个有效的问题

但它没有统一的答案,因为每个任务都是独一无二所以用的是更适合它。要正确选择你所需要知道的利弊/各的利弊所以这里是一些总结:

  1. RGB

    这好办,你可以easyly访问R,G,B频段。对于许多情况来说,最好只检查单个乐队而不是整个颜色,或者混合颜色来强调所需的功能,或者甚至抑制不需要的功能。由于强度直接编码为带,很难比较RGB中的颜色。为了弥补这一点,你可以使用规范化,但这是缓慢的(需要每像素sqrt)。你可以直接对RGB颜色进行运算。任务的

    实施例更适合于RGB:

  2. HSV因为CV算法使用HSV具有非常类似的视觉感知

    更适合于颜色识别人类的感知,所以如果你想识别不同颜色的区域,HSV更好。 RGB/HSV之间的转换需要一些时间,这可能是大分辨率或高分辨率的应用程序的问题。对于标准的DIP/CV任务通常不是这种情况。任务的

    实施例更适合于HSV:

    看一看:

    看到明显的颜色分离我HSV。在HSV上基于颜色的图像分割是容易的。做这样的决定,我只是快速绘制不同的渠道和色彩空间,看看我发现,当你不能做对HSV颜色算术,而不是直接需要转换为RGB和背部

+0

所以他们都可以在我的情况下使用? 但我的情况HSV比RGB好,因为我需要一个可以用人眼/感知区分的颜色识别,对吗? – Jaja

+0

@Jaja是的,它确实如此 – Spektre

+0

不错的总结 - 感谢分享。 –