单色增强 - MATLAB

时间:2014-04-03 18:35:00

标签: image matlab image-processing colors computer-vision

我正在用matlab编写一个红色交通灯检测器,并认为首先要做的事情之一是增强输入RGB图像中的红色。

到目前为止,这是我使用过的代码:

img_hsv = rgb2hsv(img_rgb);

h_channel = img_hsv(:,:,1);
s_channel = img_hsv(:,:,2);
v_channel = img_hsv(:,:,3);

s_channel = s_channel * 10;

img_hsv_enhanced = cat(3,h_channel,s_channel,v_channel);
img_rgb_enhanced = hsv2rgb(img_hsv_enhanced);

以下是图片增强的结果:

enter image description here

我有3个问题:

  1. 到目前为止我写的代码是最好的方法吗?即如果我在不同的频道上工作,我已经增强了图像的饱和度吗?

  2. 此代码会增强所有3种颜色,如何有选择地仅增强红色通道?

  3. 使用函数hsv2rgb转换回rgb后,我的图像的像素不再是[0,1]或[0,255]范围内的像素,而是假定小数值,有时也是负数。如何解决此问题并将其恢复为[0 255]?

1 个答案:

答案 0 :(得分:2)

  1. 我认为饱和度不是正确的方法,至少最初不是。如你所说,它增强了所有颜色,而不是特别是红色。但更重要的是,您可能需要区分对应于红绿灯和其他物体的红色补丁(您的图像中有一些很好的例子 - 道路标志,尾灯,行人灯),饱和度可能会导致信息丢失对此过滤有帮助。
  2. 要仅增强红色通道,您应该使用RGB而不是HSV。你可以这样做:

    r_channel = img_rgb(:,:,1);
    r_channel = uint8(double(r_channel * 2));
    

    但是,您应该注意,这可能导致您最重要的渠道中的信息丢失,如上一项中所述。

  3. 这是由计算s_channel = s_channel * 10;时饱和度值超过1引起的。尝试在该行后添加s_channel = s_channel / max(s_channel(:));。 hsv2rgb的输出图像应在[0,1]范围内。从那里通过重新缩放将其带回[0 255]。请务必将图像恢复为原始数据类型(很可能是uint8):img_rgb_enhanced = uint8(img_rgb_enhanced * 255);