当前位置: 首页 > news >正文

计算机视觉进阶教学之颜色识别

简介

        颜色检测就是对目标图像的所有像素点进行筛选,将符合指标的像素设置为白色,不符合指标的像素设置为黑色。

一、HSV图像类型介绍

        HSV是相对RGB的另一种颜色表示方式,它相对RGB而言,是一种比较直观的颜色模型。其中颜色的参数分别是:色调(H),饱和度(S),明度(V)。

色调H:
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;


饱和度S:
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。


明度V:
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关,光照对此值影响最大。通常取值范围为0%(黑)到100%(白)。

        一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。

  • H:  0— 180
  • S:  0— 255
  • V:  0— 255

选择HSV进行颜色检测的原因

        数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。

        相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。

        所以我们在颜色检测时,选用HSV图像。

二、代码实现

1.颜色识别

        从摄像头实时视频中,在画面中央划定一个固定的矩形区域,分析该区域内像素的颜色,并判断它最可能是哪种颜色(红、黄、绿、蓝)。

import cv2def get_color(img):H = []color_name = Noneimg = cv2.resize(img, dsize=(640, 480))# 将彩色图转成HSVHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 画矩形框cv2.rectangle(img, pt1=(280, 180), pt2=(360, 260), color=(0, 255, 0), thickness=2)# 依次取出每行每列的Hfor i in range(280, 360):for j in range(180, 260): H.append(HSV[j, i][0])# 分别计算出HH_min = min(H); H_max = max(H)# print(H_min,H_max)# 判断颜色if H_min >= 0 and H_max <= 10 or H_min >= 156 and H_max <= 180: color_name = 'red'elif H_min >= 26 and H_max <= 34: color_name = 'yellow'elif H_min >= 35 and H_max <= 77: color_name = 'green'elif H_min >= 100 and H_max <= 124: color_name = 'blue'print(color_name)return img, color_namecap = cv2.VideoCapture(0)
while 1:_, frame = cap.read()img, cal = get_color(frame)cv2.imshow('', img)if cv2.waitKey(1) == 27:break

2.识别指定颜色区域

        从摄像头实时视频中,检测出所有属于预定义颜色范围(代码中注释了两种范围,一个是绿色,一个是棕色)的像素,并将其高亮显示,其他颜色则显示为黑色。

import cv2
import numpy as npcap = cv2.VideoCapture(0)while True:try:ret, frame3 = cap.read()hsv_image = cv2.cvtColor(frame3, cv2.COLOR_BGR2HSV)# 定义颜色的范围lower_brown = np.array([35, 43, 46])  # 最小颜色值upper_brown = np.array([77, 255, 255])  # 最大颜色值# lower_brown = np.array([10, 30, 30])  # 最小颜色值# upper_brown = np.array([30, 255, 255])  # 最大颜色值# 使用颜色范围进行颜色检测 符合条件的像素被设为255(白色),不符合条件的像素被设为0(黑色)mask = cv2.inRange(hsv_image, lower_brown, upper_brown)result = cv2.bitwise_and(frame3, frame3, mask=mask)cv2.imshow('mask', mask)cv2.imshow('Filtered Image1', frame3)cv2.imshow('result', result)if cv2.waitKey(1) == 27:breakexcept:pass
# 释放摄像头资源及关闭窗口
cap.release()
cv2.destroyAllWindows()
特性代码一 (get_color.py)代码二 (color_detection.py)
核心目标识别一个固定区域内的主颜色检测高亮整个画面中所有符合特定颜色范围的像素。
颜色分析区域固定的、预设的矩形框。整个视频帧。
核心技术手动遍历像素,提取 H 值,然后用 if/elif 判断。使用 cv2.inRange() 创建掩码,再用 cv2.bitwise_and() 提取颜色。
优点逻辑简单直观,易于理解。效率极高inRange是高度优化的 C++ 实现),功能强大,可扩展性好。
缺点效率较低(Python 循环慢),颜色判断不够健壮(未考虑 S 和 V)。需要预先确定颜色的 HSV 范围,这有时需要调试。
适用场景简单的颜色分类任务,如判断交通灯颜色(假设摄像头固定)。复杂的物体追踪、颜色分割、背景消除等。
http://www.dtcms.com/a/478034.html

相关文章:

  • 实战任务二:用扣子空间通过任务提示词制作精美PPT
  • 【Docker】13、Docker安装RustFS服务
  • 什么是 Web3 品牌?
  • 指纹技术深度剖析:从原理到实践的全方位探索
  • 在 MySQL 中,当使用 SUM() 函数对某列进行求和时,如果没有符合条件的记录(即查询结果为空),SUM() 会返回 NULL
  • 公司全场景运营中 PPT 的类型、功能与作用详解
  • WHAT - SQLite 数据库
  • 网站开发 工程师 类型电商网站文档
  • 框架--Swagger
  • 网站设计的基本步骤有意思的网站
  • Ethernaut Level 10: Re-entrancy - 经典重入攻击详解
  • 维星AI GEO优化:AI搜索引擎时代,企业如何抢占流量C位?
  • 京东pc网站用什么做的php编程语言
  • STM32 单片机ADC 使用内部电压基准
  • 从美团到朴朴、我店与远方好物:本地生活的四种演化路径与未来趋势
  • U盘白名单管控工具(可以添加U盘ID无法实现白名单效果)
  • 【仿真测试】基于FPGA的完整DQPSK通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
  • 网站开发推荐资料柯城区住房和城乡建设局网站
  • 算法沉淀第一天(Triple Removal)
  • PGLRNet论文笔记
  • 如何利用docker部署springboot应用
  • 前端学习3:学习时间:40分钟
  • 网站建设主页文档互联网网站运营推广
  • 七台河网站网站建设做网站有什么意义
  • 【完整源码+数据集+部署教程】种子检测系统源码和数据集:改进yolo11-swintransformer
  • python进阶_Day7
  • DDD架构——实体、聚合、值对象
  • 一次搞懂!我用ChatGPT做学术文献综述的完整实操流程
  • 文献解读-病理区域重要性标记+细胞类型形态相互作用可解释性分析
  • Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)