鼠标点击来动态确定 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 范围,以提取不同的颜色范围。
相关推荐
AI视觉网奇2 小时前
python 统计相同像素值个数
python·opencv·计算机视觉
hunter2062066 小时前
用opencv生成视频流,然后用rtsp进行拉流显示
人工智能·python·opencv
冰万森15 小时前
【图像处理】——掩码
python·opencv·计算机视觉
Antonio91516 小时前
【opencv】第10章 角点检测
人工智能·opencv·计算机视觉
大哥喝阔落19 小时前
图片专栏——曝光度调整相关
人工智能·python·opencv
鸭鸭鸭进京赶烤21 小时前
OpenAI秘密重塑机器人军团: 实体AGI的崛起!
人工智能·opencv·机器学习·ai·机器人·agi·机器翻译引擎
山川而川-R1 天前
ubuntu电脑调用摄像头拍摄照片
人工智能·opencv·计算机视觉
Antonio9152 天前
【opencv】第9章 直方图与匹配
人工智能·opencv·计算机视觉
油泼辣子多加2 天前
【计算机视觉】人脸识别
人工智能·opencv·计算机视觉
湫ccc2 天前
《Opencv》图像的透视变换--处理发票
人工智能·opencv·计算机视觉