【问题标题】:Should I use HSV/HSB or RGB and why?我应该使用 HSV/HSB 还是 RGB,为什么?
【发布时间】:2015-05-04 03:54:55
【问题描述】:

我必须在包含另一个血细胞的图像中检测白细胞,但是可以通过细胞的颜色来区分差异,白细胞有更密集的紫色,如下图所示。

我必须使用什么颜色方法来使用 RGB/HSV ?为什么?!

示例图片:

【问题讨论】:

    标签: image-processing rgb hsv


    【解决方案1】:

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

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

    色调,(在完全饱和和完全亮度下)很难区分细胞

    饱和度大对比

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

    红色和蓝色通道很难区分细胞。

    现在我们有两个候选表示饱和度或绿色通道,我们问哪个更容易使用?由于任何 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)
    

    显示是这样的

    【讨论】:

    • 感谢您的回答,这很容易理解。但是,您能解释一下每个频道中的 (:,:,1/2/3) 吗?我知道这是为了拆分频道,但实际上它是如何工作的?它会在所有类似于饱和度值的图像示例中工作吗?或者我有时必须修改色调和亮度?对不起,我是数字图像处理的初学者
    • 在matlab中,彩色图像通常是MxNxL,其中M=# rows N=# columns L=# color channels冒号`:`表示全部。因此,当我拆分图像时,我说rgb_image(:,:,1) 这意味着(all rows, all columns, channel #1) 对于 RGB 颜色空间,我们已经知道通道 1=red 2=green 3=blue。其他色彩空间也有意义。如果您查看我的输出图像,则每张图像都有一个代表它所代表数据的标题。我希望这会有所帮助
    • 哦,非常感谢,非常有帮助...哦,为什么您的示例图像变成灰度?您对可以使用任何我可以随意更改其值的方法来查看颜色通道的工具有任何建议吗,例如 Photoshop 但在 Photoshop 中只有 RGB 通道
    • 图像是灰度的,因为它们只有一个通道。记住索引是(:,:,1/2/3),意味着只显示一个频道。我们将 MxNxL 图像转换为 MxNx1。当 matlab 只看到一个通道时,它会自动将其显示为灰度。没有简单的方法可以在 matlab 中正确显示所有颜色通道。我不知道有任何软件可以让您在正确的色彩空间中看到颜色。大多数会让你看到RGB,但没有别的。对不起
    【解决方案2】:

    在 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 并返回

    【讨论】:

    • 所以它们都可以在我的情况下使用?但就我而言,HSV 比 RGB 更好,因为我需要一种可以用人眼/感知区分的颜色识别,对吧?
    • @Jaja 是的,看起来确实如此
    猜你喜欢
    • 2015-03-11
    • 2021-05-08
    • 1970-01-01
    • 2015-05-11
    • 2013-03-18
    • 2013-03-10
    • 1970-01-01
    • 2011-04-07
    • 2013-10-11
    相关资源
    最近更新 更多