鼠标点击来动态确定 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 范围,以提取不同的颜色范围。
相关推荐
MYT_flyflyfly6 小时前
计算机视觉-OpenCV图像处理
图像处理·opencv·计算机视觉
我不是加奈14 小时前
摄像头畸变矫正
python·单片机·opencv
高力士等十万人17 小时前
有哪些滤波,原理是什么,分别在什么时候用
图像处理·python·opencv·计算机视觉
jndingxin17 小时前
OpenCV机器学习(6)朴素贝叶斯分类器(Naive Bayes Classifier)cv::ml::NormalBayesClassifier的使用
人工智能·opencv·机器学习
jndingxin17 小时前
OpenCV机器学习(3)期望最大化(Expectation-Maximization, EM)算法cv::ml::EM
opencv·算法·机器学习
weixin_4130632118 小时前
结合 deepseek,通义千问的答案理解opencv 估计刚体变换矩阵(Ransac)
人工智能·opencv
PaLu-LI1 天前
ORB-SLAM3的源码学习: Settings.cc:Settings::readCamera1/readCamera2 从配置文件中加载相机参数
人工智能·数码相机·opencv·学习·ubuntu·计算机视觉
摸鱼仙人~2 天前
Python的imutils库详细介绍
开发语言·python·opencv
Array9022 天前
OpenCV的主要模块
人工智能·opencv·计算机视觉
gloomyfish2 天前
OpenCV4.8 开发实战系列专栏之 32 - 图像梯度-更多梯度算子
图像处理·opencv·计算机视觉