在OpenCV中,inRange
函数用于根据颜色范围从图像中提取特定的颜色区域。这个函数检查输入图像中的每个像素,如果像素值位于指定的范围内,则在输出图像(或掩码)中对应位置的像素被设置为白色(或者说是255),否则被设置为黑色(0)。这种方法在处理颜色过滤、颜色识别等任务时非常有用。
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
src:输入图像,通常是经过颜色空间转换后的图像,比如从BGR转换到HSV颜色空间的图像。
lowerb:颜色范围的下界,使用Scalar类型表示。
upperb:颜色范围的上界,使用Scalar类型表示。
dst:输出图像,是一个二值图像,其中符合颜色范围的像素被设置为255,不符合的被设置为0。
红绿蓝在HSV颜色空间中的范围
在HSV颜色空间中,颜色是通过色调(Hue)、饱和度(Saturation)和亮度(Value)来定义的。不同的颜色在HSV空间中占据不同的范围,这使得HSV成为图像处理中进行颜色分割和识别的一个非常实用的颜色空间。以下是红色、绿色和蓝色在HSV颜色空间中的大致范围:
红色(Red)
色调(Hue):红色在HSV颜色圆环的两端,因此它的色调值分布在两个区域:0°到10°(接近360°的值也视为红色,因为360°等价于0°)和170°到180°。
饱和度(Saturation):高饱和度值,大约从50%到100%。
亮度(Value):亮度范围可以很宽,从较暗(约50%)到非常亮(100%)。
绿色(Green)
色调(Hue):绿色的色调值大约在35°到85°之间。
饱和度(Saturation):高饱和度值,大约从50%到100%。
亮度(Value):亮度范围同样可以从较暗到非常亮。
蓝色(Blue)
色调(Hue):蓝色的色调值大约在100°到140°之间。
饱和度(Saturation):高饱和度值,通常从50%到100%。
亮度(Value):亮度同样可以从较暗到非常亮。
注意事项
这些范围是大致估计,实际应用中可能需要根据具体情况进行调整。不同的照明条件和图像质量都可能影响颜色的HSV值。
在实际应用中,经常需要通过实验来确定最佳的HSV范围,以达到最好的颜色识别或分割效果。
特别是对于红色,因为它在HSV色环的两端,处理时可能需要分别考虑两个范围,并将结果合并。
示例1:提取绿色区域
假设有一个需求是从图像中提取绿色区域,首先需要将图像从BGR颜色空间转换到HSV颜色空间,因为HSV颜色空间更适合颜色分割:
void QuickDemo::inrange_demo(Mat &image) {
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
Mat mask;
inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
imshow("mask", mask);
示例2:提取红色区域
假设有一个需求是从图像中提取绿色区域,首先需要将图像从BGR颜色空间转换到HSV颜色空间,因为HSV颜色空间更适合颜色分割:
//图像色彩空间转换
void QuickDemo::inrange_demo(Mat &image) {
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
Mat mask1, mask2, maskRed;
//inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
Scalar lower_red1(0, 50, 50);
Scalar upper_red1(10, 255, 255);
Scalar lower_red2(170, 50, 50);
Scalar upper_red2(180, 255, 255);
// 应用第一个红色范围
inRange(hsv, lower_red1, upper_red1, mask1);
// 应用第二个红色范围
inRange(hsv, lower_red2, upper_red2, mask2);
// 合并两个红色范围的掩码
bitwise_or(mask1, mask2, maskRed);
imshow("mask", maskRed);
}
示例3:提取蓝色区域
//图像色彩空间转换
void QuickDemo::inrange_demo(Mat &image) {
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
Mat mask;
inRange(hsv, Scalar(110, 50, 50), Scalar(130, 255, 255), mask);
imshow("mask", mask);
}