OpenCV中inRange函数

在OpenCV中,inRange函数用于根据颜色范围从图像中提取特定的颜色区域。这个函数检查输入图像中的每个像素,如果像素值位于指定的范围内,则在输出图像(或掩码)中对应位置的像素被设置为白色(或者说是255),否则被设置为黑色(0)。这种方法在处理颜色过滤、颜色识别等任务时非常有用。

cpp 复制代码
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颜色空间更适合颜色分割:

cpp 复制代码
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颜色空间更适合颜色分割:

cpp 复制代码
//图像色彩空间转换
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:提取蓝色区域

cpp 复制代码
//图像色彩空间转换
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);

}

原图

提取绿色掩膜

提取蓝色掩膜

提取红色掩膜

相关推荐
取酒鱼食--【余九】5 分钟前
深度学习经典网络解析:ResNet
网络·人工智能·深度学习·神经网络·resnet·卷积神经网络·残差神经网络
搞科研的小刘选手9 分钟前
【通信&网络安全主题】第六届计算机通信与网络安全国际学术会议(CCNS 2025)
大数据·人工智能·网络安全·vr·通信工程·网络技术·计算机工程
qq_314810811 小时前
三重变革:数字革命、地缘重构与生态危机
人工智能
武子康1 小时前
AI-调查研究-104-具身智能 从模型训练到机器人部署:ONNX、TensorRT、Triton全流程推理优化详解
人工智能·gpt·ai·性能优化·机器人·tensorflow·具身智能
灵犀物润1 小时前
机器宠物建模的第一步:基础形体搭建(Blocking)
人工智能·机器人·宠物
人机与认知实验室1 小时前
触摸大语言模型的边界
人工智能·深度学习·机器学习·语言模型·自然语言处理
神的孩子都在歌唱2 小时前
PostgreSQL 向量检索方式(pgvector)
数据库·人工智能·postgresql
ARM+FPGA+AI工业主板定制专家2 小时前
基于Jetson+GMSL AI相机的工业高动态视觉感知方案
人工智能·机器学习·fpga开发·自动驾驶
新智元2 小时前
刚刚,谷歌深夜上新 Veo 3.1!网友狂刷 2.75 亿条,Sora 2 要小心了
人工智能·openai
yuzhuanhei2 小时前
Segment Anything(SAM)
人工智能