散斑环形激光图像双圆提取与同心性判定技术问询(附代码)
问题:散斑环形激光图像的双圆提取与同心性判断
需要从散斑环形激光图像中提取两个圆,并判断它们是否同心。当前编写的代码仅能拟合椭圆,无法绘制出目标圆;尝试过指定区域颜色反转寻找内圆、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
相关产品推荐
相关产品推荐

