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);

}

原图

提取绿色掩膜

提取蓝色掩膜

提取红色掩膜

相关推荐
会飞的老朱2 小时前
医药集团数智化转型,智能综合管理平台激活集团管理新效能
大数据·人工智能·oa协同办公
聆风吟º3 小时前
CANN runtime 实战指南:异构计算场景中运行时组件的部署、调优与扩展技巧
人工智能·神经网络·cann·异构计算
Codebee5 小时前
能力中心 (Agent SkillCenter):开启AI技能管理新时代
人工智能
聆风吟º6 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys6 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56786 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子6 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
智驱力人工智能7 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144877 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile7 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算