以下是使用Python对比两张CAD图并标记差异的解决方案,结合图像处理和CAD结构分析:
一、环境准备与库选择
- 图像处理库:使用OpenCV进行图像差异检测、颜色空间转换和轮廓分析。
- CAD解析库 :若为DXF格式,使用
ezdxf
解析实体信息(如块、线条、圆等)。 - 几何计算库 :
scikit-image
用于结构相似性(SSIM)和仿射变换匹配。
python
import cv2
import ezdxf
from skimage.metrics import structural_similarity
二、关键步骤实现
1. 加载与预处理
-
图像格式 :使用OpenCV读取图片并转换为灰度图,进行高斯模糊去噪。
pythonleft_img = cv2.imread("left.png") right_img = cv2.imread("right.png") gray_left = cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY) gray_right = cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY)
-
DXF格式 :通过
ezdxf
提取实体坐标和属性。pythondoc_left = ezdxf.readfile("left.dxf") doc_right = ezdxf.readfile("right.dxf")
2. 红框区域检测
-
颜色阈值法 :在HSV空间识别红色区域,提取红框坐标。
pythonhsv = cv2.cvtColor(right_img, cv2.COLOR_BGR2HSV) lower_red = np.array([0, 50, 50]) upper_red = np.array([10, 255, 255]) mask = cv2.inRange(hsv, lower_red, upper_red) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
3. 差异检测
-
图像差异法 :通过像素对比标记新增部件。
pythondiff = cv2.absdiff(gray_left, gray_right) _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
-
实体对比法(DXF) :遍历右图实体,检查是否存在于左图。
pythonright_entities = {entity.dxf.handle for entity in doc_right.modelspace()} left_entities = {entity.dxf.handle for entity in doc_left.modelspace()} new_entities = right_entities - left_entities
4. 旋转匹配检测
-
仿射变换匹配 :对左图零件进行旋转,与右图红框区域计算相似度。
python(height, width) = right_roi.shape[:2] center = (width // 2, height // 2) rotation_matrix = cv2.getRotationMatrix2D(center, angle=90, scale=1) rotated_left = cv2.warpAffine(left_roi, rotation_matrix, (width, height)) ssim_score = structural_similarity(rotated_left, right_roi) if ssim_score > 0.8: # 阈值可调整 cv2.rectangle(right_img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 标记为旋转后的零件
5. 结果标记
-
在右图中用绿色框标记旋转后的零件,用红色框标记完全新增的零件。
pythonfor (x, y, w, h) in new_contours: cv2.rectangle(right_img, (x, y), (x+w, y+h), (0, 0, 255), 2)
三、优化与注意事项
- 阈值调整:根据实际图像质量调整SSIM相似度阈值(如0.7-0.9)。
- 多角度旋转匹配:若旋转角度未知,可遍历0°-360°以寻找最大匹配值。
- 矢量数据优先:若为DXF文件,直接对比实体属性更高效。
示例输出效果
- 红色框:右图新增的独立零部件。
- 绿色框:左图零件经旋转后存在于右图的区域。
通过结合图像差异和几何变换匹配,可精准识别新增与变换的零件。若需完整代码或参数调优细节,可进一步提供CAD样本文件。