我应该使用 HSV/HSB 还是 RGB,为什么?
Should I use HSV/HSB or RGB and why?
我必须在包含另一个血细胞的图像中检测白细胞,但是可以通过细胞的颜色来区分差异,白细胞具有更浓的紫色,如下图所示。
我必须使用什么颜色方法 RGB/HSV?为什么?!
示例图片:
在 DIP 和 CV 中,这始终是一个有效的问题
但它没有通用的答案,因为每个任务都是独一无二的,所以使用更适合它的。要正确选择,您需要知道每个的 pros/cons 所以这里有一些总结:
RGB
这很容易处理,您可以轻松访问 r、g、b 波段。在许多情况下,最好只检查单个波段而不是整个颜色,或者混合颜色以强调想要的特征,甚至抑制不需要的特征。由于直接编码到波段中的强度,很难比较 RGB 中的颜色。要解决这个问题,您可以使用归一化,但速度很慢(需要每像素 sqrt)。您可以直接对 RGB 颜色进行运算。
更适合 RGB 的任务示例:
- finding horizont in high altitude photo
HSV
更适合颜色识别,因为使用 HSV 的 CV 算法具有与人类感知非常相似的视觉感知,因此如果您想识别不同颜色的区域,HSV 更好。 RGB/HSV 之间的转换需要一点时间,这对于高分辨率或高帧率应用程序来说可能是个问题。对于标准 DIP/CV 任务,通常情况并非如此。
更适合 HSV 的任务示例:
看看:
查看 HSV 中明显的分色。基于颜色的图像分割在 HSV 上很容易。您不能直接对 HSV 颜色进行算术运算,而是需要转换为 RGB 并返回
通常在做出这样的决定时,我只是快速绘制不同的通道和色彩空间,然后看看我找到了什么。从高质量的图像开始总是比从低质量的图像开始并尝试通过大量处理来修复它更好
在这种特定情况下,我会使用 HSV。但与大多数颜色分割不同,我实际上会使用饱和度通道来分割图像。单元格的色调几乎相同,因此使用色调通道将非常困难。
色调,(在全饱和度和全亮度下)很难区分细胞
饱和度反差巨大
绿色通道,其实也显示了很多对比度(让我很惊讶)
红色和蓝色通道很难真正区分细胞。
现在我们有了饱和度或绿色通道这两个候选表示,我们问哪个更容易处理?由于任何HSV工作都涉及我们转换RGB图像,我们可以忽略它,所以明确的选择是简单地使用RGB图像的绿色通道进行分割。
编辑
因为你没有包含语言标签,我想附上我刚写的一些 Matlab 代码。它在所有 4 个颜色空间中显示图像,因此您可以快速做出使用哪个的明智决定。它模仿 matlabs Color Thresholder 颜色空间选择 window
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)
显示是这样的
我必须在包含另一个血细胞的图像中检测白细胞,但是可以通过细胞的颜色来区分差异,白细胞具有更浓的紫色,如下图所示。
我必须使用什么颜色方法 RGB/HSV?为什么?!
示例图片:
在 DIP 和 CV 中,这始终是一个有效的问题
但它没有通用的答案,因为每个任务都是独一无二的,所以使用更适合它的。要正确选择,您需要知道每个的 pros/cons 所以这里有一些总结:
RGB
这很容易处理,您可以轻松访问 r、g、b 波段。在许多情况下,最好只检查单个波段而不是整个颜色,或者混合颜色以强调想要的特征,甚至抑制不需要的特征。由于直接编码到波段中的强度,很难比较 RGB 中的颜色。要解决这个问题,您可以使用归一化,但速度很慢(需要每像素 sqrt)。您可以直接对 RGB 颜色进行运算。
更适合 RGB 的任务示例:
- finding horizont in high altitude photo
HSV
更适合颜色识别,因为使用 HSV 的 CV 算法具有与人类感知非常相似的视觉感知,因此如果您想识别不同颜色的区域,HSV 更好。 RGB/HSV 之间的转换需要一点时间,这对于高分辨率或高帧率应用程序来说可能是个问题。对于标准 DIP/CV 任务,通常情况并非如此。
更适合 HSV 的任务示例:
看看:
查看 HSV 中明显的分色。基于颜色的图像分割在 HSV 上很容易。您不能直接对 HSV 颜色进行算术运算,而是需要转换为 RGB 并返回
通常在做出这样的决定时,我只是快速绘制不同的通道和色彩空间,然后看看我找到了什么。从高质量的图像开始总是比从低质量的图像开始并尝试通过大量处理来修复它更好
在这种特定情况下,我会使用 HSV。但与大多数颜色分割不同,我实际上会使用饱和度通道来分割图像。单元格的色调几乎相同,因此使用色调通道将非常困难。
色调,(在全饱和度和全亮度下)很难区分细胞
饱和度反差巨大
绿色通道,其实也显示了很多对比度(让我很惊讶)
红色和蓝色通道很难真正区分细胞。
现在我们有了饱和度或绿色通道这两个候选表示,我们问哪个更容易处理?由于任何HSV工作都涉及我们转换RGB图像,我们可以忽略它,所以明确的选择是简单地使用RGB图像的绿色通道进行分割。
编辑
因为你没有包含语言标签,我想附上我刚写的一些 Matlab 代码。它在所有 4 个颜色空间中显示图像,因此您可以快速做出使用哪个的明智决定。它模仿 matlabs Color Thresholder 颜色空间选择 window
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)
显示是这样的