You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

散斑环形激光图像双圆提取与同心性判定技术问询(附代码)

问题:散斑环形激光图像的双圆提取与同心性判断

需要从散斑环形激光图像中提取两个圆,并判断它们是否同心。当前编写的代码仅能拟合椭圆,无法绘制出目标圆;尝试过指定区域颜色反转寻找内圆、Hough Circle变换、Canny边缘检测等方法,均未取得成功。最终目标是对该散斑图像进行补偿,完成双圆的绘制并判断其同心性。

原始算法代码

import cv2
import numpy as np

# 加载图像
img = cv2.imread("covered_2.jpg", cv2.IMREAD_GRAYSCALE)

# 图像模糊
img_blur = cv2.GaussianBlur(img, (5, 5), 0)

# 图像二值化
_, img_thresh = cv2.threshold(img_blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 设置闭运算的核尺寸
kernel = np.ones((15, 15), np.uint8)

# 图像闭运算
img_close = cv2.morphologyEx(img_thresh, cv2.MORPH_CLOSE, kernel)
contours, _ = cv2.findContours(img_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
max_contour = max(contours, key=cv2.contourArea)

# 提取外椭圆
ellipse = cv2.fitEllipse(max_contour)
center, axes, angle = ellipse
major_axis, minor_axis = axes
img_ellipse = np.zeros_like(img)
cv2.ellipse(img_ellipse, ellipse, 255, 2)

# 计算长轴端点(?)
cos_angle = np.cos(np.deg2rad(angle))
sin_angle = np.sin(np.deg2rad(angle))
x1 = int(center[0] - 0.5 * major_axis * sin_angle)
y1 = int(center[1] + 0.5 * major_axis * cos_angle)
x2 = int(center[0] + 0.5 * major_axis * sin_angle)
y2 = int(center[1] - 0.5 * major_axis * cos_angle)

# 计算短轴端点(?)
x3 = int(center[0] - 0.5 * minor_axis * cos_angle)
y3 = int(center[1] - 0.5 * minor_axis * sin_angle)
x4 = int(center[0] + 0.5 * minor_axis * cos_angle)
y4 = int(center[1] + 0.5 * minor_axis * sin_angle)

# 在新图像上绘制线条
img_lines = np.zeros_like(img)
cv2.line(img_lines, (x1, y1), (x2, y2), 255, 2)
cv2.line(img_lines, (x3, y3), (x4, y4), 255, 2)
cv2.line(img, (x1, y1), (x2, y2), 255, 2)
cv2.line(img, (x3, y3), (x4, y4), 255, 2)
cv2.ellipse(img, ellipse, 255, 2)

# 在新窗口显示图像
cv2.imshow('Input Image', img)
cv2.imshow('Binary Image', img_thresh)
cv2.imshow('Closed Image', img_close)
cv2.imshow('Fitted Ellipse', img_ellipse)
cv2.imshow('Extracted Lines', img_lines)

# 保存图像
cv2.imwrite('edge_detect_circle.jpg', img)
cv2.imwrite('edge_detect_circle_close.jpg', img_close)
cv2.imwrite('edge_detect_ellipse_close.jpg', img_ellipse)
cv2.imwrite('edge_detect_lines_close.jpg', img_lines)
cv2.waitKey()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Doctor Tank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:47:15