OpenCV圆形检测:空心圆填充及圆心坐标显示功能修复求助
问题解决:填充空心圆并显示圆心坐标
你的代码核心逻辑没问题,但存在文字颜色与填充色冲突的问题——填充后的圆是白色(255),文字也用白色(255)绘制,导致文字完全看不见。以下是修正后的代码和关键说明:
修正后的代码
import cv2 import numpy as np # 读取图像并转为灰度图 im_in = cv2.imread("circle.jpg", cv2.IMREAD_GRAYSCALE) # 二值化处理 th, im_th = cv2.threshold(im_in, 127, 255, cv2.THRESH_BINARY) # 洪水填充背景区域 im_floodfill = im_th.copy() h, w = im_th.shape[:2] mask = np.zeros((h+2, w+2), np.uint8) cv2.floodFill(im_floodfill, mask, (0, 0), 255) # 反转填充结果,提取空心圆区域 im_floodfill_inv = cv2.bitwise_not(im_floodfill) im_out = im_th | im_floodfill_inv # 检测外部轮廓 contours, _ = cv2.findContours(im_out, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 将灰度图转为彩色图,避免文字与填充色冲突 im_out_color = cv2.cvtColor(im_out, cv2.COLOR_GRAY2BGR) for contour in contours: M = cv2.moments(contour) if M["m00"] != 0: # 计算圆心坐标 cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) # 填充空心圆为白色 cv2.drawContours(im_out_color, [contour], 0, (255, 255, 255), -1) # 绘制黑色圆心坐标,确保在白色背景上清晰可见 cv2.putText(im_out_color, f'({cX}, {cY})', (cX - 30, cY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2, cv2.LINE_AA) # 保存结果图像 cv2.imwrite("circles_filled_with_coordinates.png", im_out_color)
关键修改说明
- 解决文字不可见问题:将灰度图转为彩色图,用黑色(
(0,0,0))绘制坐标文字,与白色填充的圆形成鲜明对比,确保文字清晰显示。如果偏好灰度图,只需把putText的颜色参数改为0(黑色)即可。 - 保留核心功能:洪水填充、轮廓检测、圆心计算的核心逻辑完全保留,确保填充和坐标计算的准确性。
内容的提问来源于stack exchange,提问作者wooproop
相关产品推荐
相关产品推荐

