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

}

原图

提取绿色掩膜

提取蓝色掩膜

提取红色掩膜

相关推荐
阿三08126 分钟前
跨境电商售后自动化分级标准:哪些能全自动、哪些半自动、哪些禁止自动化
大数据·人工智能·自动化
IT_陈寒11 分钟前
JavaScript的this又双叒叕让我怀疑人生了
前端·人工智能·后端
颜酱23 分钟前
09 | 重构项目结构
人工智能·python·langchain
ZhengEnCi1 小时前
AI Agent(AI智能体) 记忆管理系统设计 — 从向量库边界到生产级 Memory(记忆) 架构
人工智能
凉菜lc1 小时前
对比文《IM Bot 框架怎么选?Zhin vs Koishi vs NoneBot》
人工智能
阿里云大数据AI技术1 小时前
DataWorks Data Agent 实战课堂(三):对话式完成数据同步与智能诊断
人工智能·agent
骇客野人2 小时前
AI全栈开发指定技术架构
人工智能
Escape2 小时前
为什么你的 AI 越聊越傻?从 Token 到 Agent,彻底搞懂 AI Agent的秘密㊙️
前端·人工智能·后端
2501_926978332 小时前
认知边缘的双向耦合:从核技术类比到智力货币时代
人工智能·经验分享·笔记·ai写作
SQDN3 小时前
Chatbox 1.22.1 获取不到模型?先验 /models,再对齐精确 model ID
人工智能·测试工具·机器学习·chatgpt·json