鼠标点击来动态确定 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()
代码说明:
- 鼠标点击获取颜色值:
当用户点击图像时,通过鼠标回调函数 mouse_callback() 获取点击位置的 BGR 值,然后将其转换为 HSV。
打印出的 BGR 和 HSV 值是用于调试的。
- 设定 HSV 范围:
使用点击的 HSV 值来生成上下限范围,稍微扩展一下上下限(+/- 10)来包含颜色的近似值。
上下限中的色相范围是 ±10,而饱和度和亮度可以根据情况调整。
- 图像处理:
通过 cv2.inRange() 函数使用生成的 HSV 范围来创建掩码,接着用掩码提取出该颜色的部分。
之后,通过 cv2.findContours() 查找轮廓,并在原图上绘制矩形框标出提取到的区域。
使用步骤:
- 运行程序,图像窗口会弹出。
- 在弹出的图像窗口中点击你希望提取的蓝色框的某一点。 程序将提取点击位置的 HSV 值,使用这个 HSV 值来提取图像中所有符合这个颜色范围的区域。 你可以根据需要调整 HSV 范围,以提取不同的颜色范围。