以下是使用Python對比兩張CAD圖并標記差異的解決方案,結合圖像處理和CAD結構分析:
一、環境準備與庫選擇
- 圖像處理庫:使用OpenCV進行圖像差異檢測、顏色空間轉換和輪廓分析。
- CAD解析庫:若為DXF格式,使用
ezdxf
解析實體信息(如塊、線條、圓等)。 - 幾何計算庫:
scikit-image
用于結構相似性(SSIM)和仿射變換匹配。
import cv2
import ezdxf
from skimage.metrics import structural_similarity
二、關鍵步驟實現
1. 加載與預處理
- 圖像格式:使用OpenCV讀取圖片并轉換為灰度圖,進行高斯模糊去噪。
left_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
提取實體坐標和屬性。doc_left = ezdxf.readfile("left.dxf") doc_right = ezdxf.readfile("right.dxf")
2. 紅框區域檢測
- 顏色閾值法:在HSV空間識別紅色區域,提取紅框坐標。
hsv = 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. 差異檢測
- 圖像差異法:通過像素對比標記新增部件。
diff = cv2.absdiff(gray_left, gray_right) _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
- 實體對比法(DXF):遍歷右圖實體,檢查是否存在于左圖。
right_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. 旋轉匹配檢測
- 仿射變換匹配:對左圖零件進行旋轉,與右圖紅框區域計算相似度。
(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. 結果標記
- 在右圖中用綠色框標記旋轉后的零件,用紅色框標記完全新增的零件。
for (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樣本文件。