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

鼠标点击来动态确定 HSV 范围

根据鼠标点击来动态确定 HSV 范围,可以先获取用户点击的像素值,然后使用这个值生成合适的 HSV 范围。这样,我们可以提取图像中的特定颜色(比如蓝色框)

代码步骤:

  • 获取鼠标点击的颜色值:用户点击图像后,从该点提取 HSV 值。

  • 定义 HSV 范围:以点击的 HSV 值为中心,设置一定的上下限范围。

  • 基于 HSV 范围提取颜色:使用提取的 HSV 范围进行颜色分割,并提取相应的框。

     import cv2
     import numpy as np
     
     # 全局变量
     hsv_clicked = None
     
     def mouse_callback(event, x, y, flags, param):
         global hsv_clicked
         if event == cv2.EVENT_LBUTTONDOWN:  # 当检测到左键点击时
             # 获取点击处的BGR像素值
             pixel = img[y, x]
             print(f"Clicked BGR value: {pixel}")
             
             # 将BGR值转换为HSV
             hsv_pixel = cv2.cvtColor(np.uint8([[pixel]]), cv2.COLOR_BGR2HSV)
             hsv_clicked = hsv_pixel[0][0]
             print(f"Clicked HSV value: {hsv_clicked}")
     
             # 重新处理图像
             process_image_with_hsv_range(hsv_clicked)
     
     def process_image_with_hsv_range(hsv_value):
         # 设定点击颜色的HSV范围 (可根据需要调整)
         lower_hsv = np.array([hsv_value[0] - 10, max(50, hsv_value[1] - 50), max(50, hsv_value[2] - 50)])
         upper_hsv = np.array([hsv_value[0] + 10, min(255, hsv_value[1] + 50), min(255, hsv_value[2] + 50)])
     
         print(f"Lower HSV: {lower_hsv}")
         print(f"Upper HSV: {upper_hsv}")
     
         # 将图像转换为HSV
         hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
         
         # 基于点击的HSV范围生成掩码
         mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
         
         # 使用掩码提取颜色
         result = cv2.bitwise_and(img, img, mask=mask)
     
         # 查找边缘
         gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)
         edges = cv2.Canny(gray, 50, 150)
     
         # 查找轮廓
         contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
         
         # 绘制轮廓的矩形框
         for contour in contours:
             area = cv2.contourArea(contour)
             if area > 500:  # 过滤小的轮廓
                 x, y, w, h = cv2.boundingRect(contour)
                 cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
         
         # 显示结果
         cv2.imshow("Processed Image", img)
     
     # 加载图像
     image_path = "/mnt/data/blue.png"
     img = cv2.imread(image_path)
     
     # 显示图像并设置鼠标回调函数
     cv2.imshow('Image', img)
     cv2.setMouseCallback('Image', mouse_callback)
     
     # 等待用户操作
     cv2.waitKey(0)
     cv2.destroyAllWindows()
    

代码说明:

  1. 鼠标点击获取颜色值:

当用户点击图像时,通过鼠标回调函数 mouse_callback() 获取点击位置的 BGR 值,然后将其转换为 HSV。
打印出的 BGR 和 HSV 值是用于调试的。

  1. 设定 HSV 范围:

使用点击的 HSV 值来生成上下限范围,稍微扩展一下上下限(+/- 10)来包含颜色的近似值。
上下限中的色相范围是 ±10,而饱和度和亮度可以根据情况调整。

  1. 图像处理:

通过 cv2.inRange() 函数使用生成的 HSV 范围来创建掩码,接着用掩码提取出该颜色的部分。
之后,通过 cv2.findContours() 查找轮廓,并在原图上绘制矩形框标出提取到的区域。

使用步骤:

  • 运行程序,图像窗口会弹出。
  • 在弹出的图像窗口中点击你希望提取的蓝色框的某一点。 程序将提取点击位置的 HSV 值,使用这个 HSV 值来提取图像中所有符合这个颜色范围的区域。 你可以根据需要调整 HSV 范围,以提取不同的颜色范围。

http://www.kler.cn/a/299151.html

相关文章:

  • 【进程篇】操作系统
  • web自动化测试知识总结
  • python:用 sklearn 构建线性回归模型,并评价
  • 二进制分析的新兴趋势:塑造安全的移动应用
  • ubuntu16.04ros-用海龟机器人仿真循线系统
  • 算法-Z-order算法
  • QT Creater实现国庆节主题项目【0基础完成版】
  • 算法工程师重生之第三天( 链表理论基础 移除链表元素 设计链表 反转链表 )
  • 【PostgreSQL教程】PostgreSQL 高级篇之子查询
  • Linux——redis主从复制、集群模式、哨兵模式
  • 漫谈设计模式 [10]:享元模式
  • 机器学习和深度学习的区别是什么?
  • 插槽slot
  • Linux环境常用的一些网络相关的命令
  • 【Linux】循序进阶学运维-服务篇-tomcat入门
  • Linux:从入门到放弃
  • mysql5.7安装
  • ros2中使用launch.xml启动时,怎么在命令行里设置参数,或者加载参数文件(params.yaml)
  • 版权与开源协议:一场创新与自由的边界之争
  • 关于武汉芯景科技有限公司的IIC电平转换芯片XJ4300开发指南(兼容LTC4300)
  • 大模型备案重难点最详细说明【评估测试题+附件】
  • Linux开发工具的使用
  • DBeaver 24.2 发布下载,新增功能概览
  • HalconDotNet中的图像视频采集
  • 社交媒体的未来:Facebook如何通过AI技术引领潮流
  • 2024/9/10黑马头条跟学笔记(六)