首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用HSV/HSB还是RGB ?为什么?

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

Stack Overflow用户
提问于 2015-05-04 03:54:55
回答 2查看 5.5K关注 0票数 5

我要在一张包含另一种血细胞的图像中检测到白细胞,但是通过细胞的颜色可以分辨出差异,白细胞有更浓的紫色,可以在下面的图像中看到。

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

样本图像:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-04 17:42:35

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

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

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

饱和巨大反差

绿色频道,其实也显示了很大的对比(这让我很惊讶)

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

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

编辑

由于您没有包含语言标记,所以我想附加一些我刚刚编写的Matlab代码。它在所有4种颜色空间中显示一幅图像,这样您就可以迅速做出使用哪种颜色的明智决定。它模拟matlabs阈值机颜色空间选择窗口

代码语言:javascript
复制
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

你可以这样称呼它

代码语言:javascript
复制
rgbim = imread('http://i.stack.imgur.com/gd62B.jpg');
ViewColorSpaces(rgbim)

显示是这样的

票数 14
EN

Stack Overflow用户

发布于 2015-05-04 07:25:53

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

但是它没有通用的答案,因为每个任务都是独一无二的,所以要使用更适合它的东西。要正确选择,您需要了解每种方法的优缺点,以下是一些总结:

  1. RGB 这很容易处理,您可以轻松地访问r,g,b波段。在许多情况下,最好是检查单波段,而不是整个颜色,或混合颜色,以强调想要的特点,甚至削弱不想要的一个。由于直接编码到波段的强度,RGB中的颜色比较困难。要弥补这一点,您可以使用规范化,但这是缓慢的(需要每像素平方吨)。你可以直接在RGB颜色上做算术。 更适合RGB的任务示例:
代码语言:javascript
复制
- [finding horizont in high altitude photo](https://stackoverflow.com/q/22187205/2521214)

  1. HSV 更适合于颜色识别,因为使用HSV的CV算法与人类的视觉感知非常相似,所以如果你想识别不同颜色的区域,HSV更好。RGB/HSV之间的转换需要一些时间,这对于大分辨率或apps应用程序来说都是个问题。对于标准的DIP/CV任务来说,情况通常并非如此。 更适合HSV的任务示例:
代码语言:javascript
复制
- [Compare RGB colors](https://stackoverflow.com/q/28270103/2521214)

看一看:

代码语言:javascript
复制
- [HSV histogram](https://stackoverflow.com/a/29286584/2521214)

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30022377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档