【发布时间】:2015-05-04 03:54:55
【问题描述】:
我必须在包含另一个血细胞的图像中检测白细胞,但是可以通过细胞的颜色来区分差异,白细胞有更密集的紫色,如下图所示。
我必须使用什么颜色方法来使用 RGB/HSV ?为什么?!
示例图片:
【问题讨论】:
标签: image-processing rgb hsv
我必须在包含另一个血细胞的图像中检测白细胞,但是可以通过细胞的颜色来区分差异,白细胞有更密集的紫色,如下图所示。
我必须使用什么颜色方法来使用 RGB/HSV ?为什么?!
示例图片:
【问题讨论】:
标签: image-processing rgb hsv
通常在做出这样的决定时,我只是快速绘制不同的通道和色彩空间,然后看看我发现了什么。从高质量图像开始总是比从低质量图像开始并尝试通过大量处理来修复它更好
在这种特定情况下,我会使用 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)
显示是这样的
【讨论】:
MxNxL,其中M=# rows N=# columns L=# color channels冒号`:`表示全部。因此,当我拆分图像时,我说rgb_image(:,:,1) 这意味着(all rows, all columns, channel #1) 对于 RGB 颜色空间,我们已经知道通道 1=red 2=green 3=blue。其他色彩空间也有意义。如果您查看我的输出图像,则每张图像都有一个代表它所代表数据的标题。我希望这会有所帮助
(:,:,1/2/3),意味着只显示一个频道。我们将 MxNxL 图像转换为 MxNx1。当 matlab 只看到一个通道时,它会自动将其显示为灰度。没有简单的方法可以在 matlab 中正确显示所有颜色通道。我不知道有任何软件可以让您在正确的色彩空间中看到颜色。大多数会让你看到RGB,但没有别的。对不起
在 DIP 和 CV 中这总是一个有效的问题
但它没有通用的答案,因为每个任务都是独一无二的,所以使用更适合它的。要正确选择,您需要了解每种方法的优缺点,所以这里有一些总结:
RGB
这很容易处理,您可以轻松访问 r、g、b 波段。在许多情况下,最好只检查单个波段而不是整个颜色,或者混合颜色以强调想要的功能,甚至抑制不需要的功能。由于强度直接编码为波段,因此很难比较 RGB 中的颜色。为了解决这个问题,您可以使用归一化,但这很慢(需要每像素 sqrt)。您可以直接对 RGB 颜色进行算术运算。
更适合 RGB 的任务示例:
HSV
更适合颜色识别,因为使用 HSV 的 CV 算法具有与人类感知非常相似的视觉感知,因此如果您想识别不同颜色的区域,HSV 更好。 RGB/HSV 之间的转换需要一些时间,这对于大分辨率或高 fps 应用程序来说可能是个问题。对于标准 DIP/CV 任务,通常情况并非如此。
更适合 HSV 的任务示例:
看看:
查看 HSV 中明显的颜色分离。基于颜色的图像分割在 HSV 上很容易。您不能直接对 HSV 颜色进行算术运算,而是需要转换为 RGB 并返回
【讨论】: