
Python+opencv处理图像的轮廓,将图像中三个相近的圆形轮廓合并成一个轮廓和提供相关代码

下午好🌅🌅🌅
本答案参考通义千问
在使用 Python + OpenCV 处理图像轮廓时,如果需要将三个相近的圆形轮廓合并为一个轮廓,可以按照以下步骤进行处理:
你提到“将图像中三个相近的圆形轮廓合并成一个轮廓”,这通常意味着:
cv2.findContours() 获取所有轮廓4 * π * (Area / (Perimeter²)),越接近 1 越圆import cv2
import numpy as np
# 加载图像
image = cv2.imread("circles.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 定义圆度函数
def is_circle(contour, threshold=0.8):
area = cv2.contourArea(contour)
perimeter = cv2.arcLength(contour, True)
if perimeter == 0:
return False
circularity = (4 * np.pi * area) / (perimeter ** 2)
return circularity > threshold
# 筛选圆形轮廓
circle_contours = []
for cnt in contours:
if is_circle(cnt):
circle_contours.append(cnt)
# 计算每个轮廓的中心点
centers = [tuple(np.mean(cnt, axis=(0, 1)).astype(int)) for cnt in circle_contours]
# 设置合并距离阈值
merge_threshold = 50 # 根据实际调整
# 合并相近的轮廓
merged_contours = []
used = [False] * len(circle_contours)
for i in range(len(circle_contours)):
if used[i]:
continue
merged = circle_contours[i]
for j in range(i + 1, len(circle_contours)):
if not used[j]:
dx = abs(centers[i][0] - centers[j][0])
dy = abs(centers[i][1] - centers[j][1])
if dx < merge_threshold and dy < merge_threshold:
merged = np.concatenate((merged, circle_contours[j]))
used[j] = True
merged_contours.append(merged)
used[i] = True
# 绘制结果
result = image.copy()
for cnt in merged_contours:
cv2.drawContours(result, [cnt], -1, (0, 255, 0), 2)
# 显示结果
cv2.imshow("Merged Circles", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
is_circle() 函数过滤出真正接近圆形的轮廓。np.concatenate() 将多个轮廓的点合并成一个新的轮廓。merge_threshold 和 threshold 需根据具体图像进行微调。通过上述方法,你可以有效地将三个相近的圆形轮廓合并为一个轮廓。此方法适用于图像中存在多个小圆或圆环状结构的情况,尤其适合用于目标检测、图像分割等场景。
如果你有具体的图像或更多需求,请提供更多信息,我可以进一步优化代码。