我正在用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);
以下是图片增强的结果:
我有3个问题:
到目前为止我写的代码是最好的方法吗?即如果我在不同的频道上工作,我已经增强了图像的饱和度吗?
此代码会增强所有3种颜色,如何有选择地仅增强红色通道?
使用函数hsv2rgb
转换回rgb后,我的图像的像素不再是[0,1]或[0,255]范围内的像素,而是假定小数值,有时也是负数。如何解决此问题并将其恢复为[0 255]?
答案 0 :(得分:2)
要仅增强红色通道,您应该使用RGB而不是HSV。你可以这样做:
r_channel = img_rgb(:,:,1);
r_channel = uint8(double(r_channel * 2));
但是,您应该注意,这可能导致您最重要的渠道中的信息丢失,如上一项中所述。
这是由计算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);
。