如何获取图像中不规则涂黑圆形的坐标?Blob检测是否可靠?
黑色涂绘圆形坐标检测方案
针对你提到的不规则黑色涂绘圆形,以下几种方法都能可靠获取其坐标,Blob检测其实完全适用,只要做好参数调整:
一、预处理:先强化目标区域
因为黑色涂绘和背景对比度高,先做二值化处理,把图像转成黑白,突出目标区域:
import cv2 import numpy as np # 读取图像 img = cv2.imread('your_image.png') # 转灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化:把黑色区域设为前景(这里黑色像素值低,所以用THRESH_BINARY_INV) _, binary = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY_INV)
调整阈值50可以适配不同光照下的图像,确保黑色区域被完整保留。
二、优化后的Blob检测
Blob检测对这种颜色单一、有一定面积的不规则区域非常有效,只要针对性设置过滤参数:
# 设置Blob检测参数 params = cv2.SimpleBlobDetector_Params() # 只检测黑色区域(对应二值化后的白色区域,所以blobColor设为255) params.filterByColor = True params.blobColor = 255 # 过滤掉过小的噪声区域,根据实际图像调整面积范围 params.filterByArea = True params.minArea = 1000 params.maxArea = 100000 # 忽略圆度,适配不规则涂绘 params.filterByCircularity = False # 创建检测器并检测 detector = cv2.SimpleBlobDetector_create(params) keypoints = detector.detect(binary) # 获取坐标:每个keypoint的pt属性就是圆心坐标 for kp in keypoints: x, y = kp.pt print(f"黑色圆形坐标:({x:.2f}, {y:.2f})")
这里关闭了圆度过滤,专门适配不规则的涂绘,只要面积在合理范围内就能检测到目标。
三、轮廓检测(备选方案)
如果Blob检测效果不理想,用轮廓检测+质心计算也能精准获取坐标:
# 查找轮廓 contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓,筛选目标(这里假设只有一个黑色圆形,取面积最大的轮廓) target_contour = max(contours, key=cv2.contourArea) # 计算质心 M = cv2.moments(target_contour) if M["m00"] != 0: cx = int(M["m10"] / M["m00"]) cy = int(M["m01"] / M["m00"]) print(f"黑色圆形质心坐标:({cx}, {cy})") # 或者计算最小外接圆的圆心 (x, y), radius = cv2.minEnclosingCircle(target_contour) print(f"黑色圆形外接圆圆心坐标:({x:.2f}, {y:.2f})")
这种方法对极不规则的涂绘兼容性更好,质心坐标能代表区域的中心位置。
四、霍夫圆检测(补充方案)
如果涂绘接近圆形,也可以尝试霍夫圆检测,调整参数适配不规则性:
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1.2, minDist=50, param1=50, param2=30, minRadius=20, maxRadius=100) if circles is not None: circles = np.uint16(np.around(circles)) for i in circles[0, :]: print(f"检测到的圆形坐标:({i[0]}, {i[1]})")
调整param2(检测阈值)可以降低对圆度的要求,数值越小越容易检测到不规则的圆形。
内容的提问来源于stack exchange,提问作者PaulS
相关产品推荐
相关产品推荐

