如何统计图像中指定颜色物体的角点数量
实现指定颜色区域角点统计的方案
核心逻辑
要实现按颜色筛选角点,只需要在原有角点检测的基础上增加颜色掩码过滤步骤即可,具体流程如下:
- 将图像从BGR色彩空间转换为HSV色彩空间,HSV更适合做单一颜色的精准提取
- 设定目标颜色的HSV阈值范围,生成仅保留目标颜色区域的二值掩码
- 完成全图角点检测后,逐一校验角点坐标是否落在掩码的有效区域(目标颜色区域)内,仅统计符合条件的角点
完整修改代码
import cv2 import numpy as np import matplotlib.pyplot as plt def cornerpoint_by_color(img_path, lower_hsv, upper_hsv): # 读取图像 img = cv2.imread(img_path) # 转换为HSV色彩空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 生成指定颜色的掩码 mask = cv2.inRange(hsv, lower_hsv, upper_hsv) # 原有Harris角点检测逻辑 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = np.float32(gray) dst = cv2.cornerHarris(gray,5,3,0.04) ret, dst = cv2.threshold(dst,0.1*dst.max(),255,0) dst = np.uint8(dst) ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001) corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria) # 过滤属于指定颜色区域的角点 valid_corners = [] for i in range(1, len(corners)): x, y = int(corners[i][0]), int(corners[i][1]) # 判断角点是否在目标颜色掩码范围内 if mask[y, x] == 255: valid_corners.append(corners[i]) # 标记有效角点为红色 cv2.circle(img, (x, y), 3, (0, 0, 255), -1) # 输出统计结果 print(f"指定颜色区域的角点数量为:{len(valid_corners)}") for idx, pt in enumerate(valid_corners): print(f"角点{idx+1}坐标:{pt}") # 转换为RGB格式适配matplotlib显示 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img_rgb) plt.show() return len(valid_corners) # 调用示例:提取蓝色区域的角点,蓝色HSV范围可根据实际图像调整 lower_blue = np.array([100, 43, 46]) upper_blue = np.array([124, 255, 255]) cornerpoint_by_color('/content/shapes.png', lower_blue, upper_blue)
参数调整说明
- 如果需要识别其他颜色,只需修改传入的
lower_hsv和upper_hsv阈值即可,可以通过取色工具读取目标像素的HSV值,设置上下浮动范围即可 - 如果出现角点漏检或多检的情况,可以调整
cv2.cornerHarris的最后一个参数,或者调整阈值0.1*dst.max()的系数,系数越大保留的角点越少
内容的提问来源于stack exchange,提问作者Asp Lab
相关产品推荐
相关产品推荐

