鼠标点击来动态确定 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 范围,以提取不同的颜色范围。
相关推荐
点PY18 小时前
基于Sparse Optical Flow 的Homography estimation
人工智能·opencv·计算机视觉
越甲八千18 小时前
opencv滤波算法总结
opencv
越甲八千18 小时前
opencv对比度增强方法算法汇总
人工智能·opencv·算法
独木三绝18 小时前
OpenCV第八章——腐蚀与膨胀
人工智能·opencv·计算机视觉
红米煮粥20 小时前
OpenCV-直方图
人工智能·opencv·计算机视觉
嵌入式杂谈1 天前
计算机视觉——基于OpenCV和Python进行模板匹配
python·opencv·计算机视觉
yery1 天前
Ubuntu24.04下编译OpenCV + OpenCV Contrib 4.10.0
人工智能·opencv·计算机视觉
点PY1 天前
基于SIFT / ORB的Homography estimation
人工智能·opencv·计算机视觉
六个核桃Lu1 天前
图像处理与OCR识别的实践经验(2)
图像处理·人工智能·python·opencv·ocr
莱茶荼菜1 天前
使用c#制作一个小型桌面程序
开发语言·opencv·c#