(CAD)利用图像识别给CAD图纸找不同(理论讲解)

🏡作者主页:点击! 

🤖编程探索专栏:点击!

⏰️创作时间:2024年10月31日10点02分


一、背景及意义介绍

背景介绍

  • 工程领域对图纸准确性要求高
    • 在工程设计和施工中,CAD图纸是非常关键的文件,它包含了工程的各种详细设计信息,如建筑结构、机械零件的尺寸和形状、电气线路的布局等。这些信息的准确性直接关系到工程的质量、安全、进度和成本。
    • 例如,在建筑工程中,如果建筑图纸的尺寸标注错误,可能导致建筑物的结构不稳定;在机械制造中,零件图纸的形状误差可能使零件无法正常装配。
  • 图纸比对工作的现状及问题
    • 目前,图纸比对工作主要依赖人工进行。设计人员或审核人员需要手动对照两张图纸,逐一对各个图元(如线条、图形、标注等)进行检查,以确定是否存在差异。
    • 这种人工比对方式存在诸多弊端。首先,效率极低,尤其是对于复杂的大型工程图纸,人工比对可能需要耗费大量的时间和精力。其次,容易受到主观因素的影响,如审核人员的疲劳、注意力不集中、个人经验和判断标准的差异等,这些因素都可能导致比对结果出现错误或遗漏。

意义介绍

  • 提高图纸比对效率和准确性
    • 基于图像处理的CAD图纸比对算法能够实现自动化的图纸比对过程。通过一系列图像处理技术,算法可以快速、准确地检测出两张图纸之间的差异,大大提高了比对工作的效率。
    • 与人工比对相比,算法不受主观因素的影响,能够提供更加客观、一致的比对结果,减少了因人为错误导致的工程风险。
  • 保障工程质量和安全
    • 通过及时发现图纸中的差异和错误,施工团队可以在施工前对图纸进行修正,避免按照错误的图纸进行施工,从而保障工程的质量和安全。
    • 例如,如果在比对过程中发现结构图纸中的某个关键支撑构件的尺寸发生了变化,施工方可以及时与设计方沟通,确保施工的准确性。
  • 辅助设计工作和优化设计方案
    • 该算法对于设计人员也具有重要的辅助作用。在设计过程中,设计师可能会对图纸进行多次修改,通过使用比对算法,可以快速了解每次修改的具体内容,有助于设计师更好地跟踪设计思路,优化设计方案。
    • 比如,设计师可以通过比对不同版本的图纸,发现哪些部分进行了调整,从而评估这些调整对整体设计的影响,进一步完善设计。

二、概述

本算法旨在对 CAD 图纸进行比对,通过一系列图像处理步骤,包括格式转换、边缘切割对齐、去噪、差值比对、腐蚀膨胀和标注归一,快速发现两幅 CAD 图纸之间的差异。

三、论文思路

为解决人工比对 CAD 图纸效率低且易受主观因素影响的问题,提出一种基于图像处理的 CAD 图纸比对算法,通过一系列图像处理步骤实现自动比对,快速发现图纸差异。

具体步骤

  1. 格式转换
    • 将CAD图纸(如DWG)转PDF,保证一致,调用虚拟打印驱动设置参数。
  1. 边缘切割对齐
    • 因图纸可能有白边和倾斜,先边缘检测,再轮廓或直线检测算外接矩形,接着算角度和中心旋转图像,重复检测确定区域后裁剪。
  1. 高斯滤波去噪
    • 针对图纸噪声,用高斯滤波,按分布特性给像素加权抑制噪声保留细节。
  1. 差值比对
    • 用图像减法找差异,相减结果二值化,用滑动窗口分析消除误差。
  1. 腐蚀膨胀
    • 针对比对误检漏检,腐蚀取邻域最小值消除噪声点,膨胀取最大值填补空洞。
  1. 标注归一
    • 可视化差异,分割图像标记,合并框后在CAD图纸标记。

四、方法介绍

基于图像处理的CAD图纸比对算法的方法介绍

  1. CAD图纸格式转换
    • 方法:选用将CAD图纸(如常见的DWG格式)转换为PDF文件。通过调用CAD软件的PDF虚拟打印驱动来实现,在转换过程中需要设置合适的分辨率、尺寸、范围等参数,以确保转换后的PDF文件与原始CAD文件在图形数据和视觉属性上完全一致。
  1. 图纸边缘切割对齐
    • 方法
      • 边缘检测:使用OpenCV的cv2.Canny()函数对图像进行边缘检测,找出图像中像素值发生明显变化的地方,即边缘。
      • 轮廓或直线检测及外接矩形计算:接着使用cv2.findContours()函数或cv2.HoughLines()函数进行轮廓或直线检测,并使用cv2.boundingRect()函数或cv2.minAreaRect()函数计算能够包含图像中的轮廓或直线的最大外接矩形。
      • 旋转角度和中心计算:然后使用cv2.minAreaRect()函数或math.atan2()函数计算旋转角度和中心,以便将图纸旋转到水平方向,使最大外接矩形与水平方向对齐。
      • 图像旋转:通过cv2.getRotationMatrix2D()函数生成旋转矩阵,并使用cv2.warpAffine()函数对图像进行仿射变换,实现图像旋转。
      • 再次检测和裁剪:对旋转后的图像再次进行边缘检测、轮廓或直线检测以及最大外接矩形计算,以更准确地确定图纸中有效区域的范围和位置。最后根据cv2.boundingRect()函数或cv2.minAreaRect()函数返回的信息裁剪图像,去除空白边缘。
  1. 高斯滤波去噪
    • 方法:采用高斯滤波这种线性平滑滤波方法。根据高斯分布的特性,给予靠近均值的像素较高的权重,而给予远离均值(即可能受到噪声影响)的像素较低的权重。具体计算过程为:首先根据给定的标准差σ和卷积核大小计算高斯核矩阵,然后将原始图像扩展为边缘填充后的图像,使得卷积后的图像大小不变。对于扩展后的图像中的每一个像素点,将其邻域与高斯核矩阵进行卷积运算,得到新的像素值,所有新的像素值组成一个新的图像,即为高斯滤波后的图像。
  1. 差值比对
    • 方法:采用图像减法的方法,将其中一张图像作为被减数,另一张图像作为减数,对它们进行逐像素的相减运算。如果两张图像在某个像素点上完全相同,那么相减后得到的结果就是0值;如果两张图像在某个像素点上有差异,那么相减后得到的结果就是非0值。将相减后得到的结果图像进行二值化处理,即将非0值转换为255值,将0值保持不变,得到一张黑白的二值图像,其中白色代表两张原始图像有差异的区域,黑色代表两张原始图像无差异的区域。由于CAD图纸中可能存在一些细微的误差或噪声,引入一个3×3的滑动窗口,用来对二值图像进行区域分析。具体来说,将滑动窗口从左上角开始,在二值图像上逐行扫描,每次移动一个像素点。对于每个滑动窗口内的9个像素点,统计其中0值和255值的个数。如果在3×3的区域内,0值的个数少于三分之二,说明这一区域有差异,就将这一区域全部置为0值(即黑色);如果在3×3的区域内,0值的个数大于等于三分之二,说明这一区域无差异,就将这一区域全部置为255值(即白色)。
  1. 腐蚀膨胀
    • 方法
      • 腐蚀:对图像进行腐蚀操作,腐蚀是一种收缩操作,它取每一个位置的矩形邻域内值的最小值作为该位置的输出灰度值。通过腐蚀操作,可以消除小区域内的噪声或误检点。
      • 膨胀:接着对腐蚀后的图像进行膨胀操作,膨胀是一种扩张操作,它取每一个只位根据前面的腐蚀操作所确定的位置,取其邻域内值的最大值作为该位置的输出灰度值。通过膨胀操作,可以填补小区域内的空洞或漏检点。
  1. 标注归一
    • 方法:首先利用图像分割的方法,将图像中的黑点区域与白色背景区域分开,并用圆形框标记出来。然后将细小的长条框去除,将相邻或重叠的来自不同圆形框的长条框合并为一个,以减少框的数量和提高识别的准确性。最后将处理后的图像与原始CAD图纸进行比对,将框出的黑点区域在CAD图纸上用相同的颜色和形状标记出来,以便于观察和分析。

五、复现过程

(1)CAD图纸转换为PDF

  1. 步骤说明
    • 由于CAD图纸可能存在多种格式且有兼容性问题,选择将其转换为PDF格式以便后续处理。转换过程需调用CAD的PDF虚拟打印驱动,并设置相关参数(分辨率、尺寸、范围等)。
  1. 代码实现(示例为手动转换后的读取操作)
import cv2

# 读取转换后的PDF图像(假设已转换为可识别的图像格式,如JPEG或PNG)
image1 = cv2.imread('image1.jpg')  # 第一张图纸图像
image2 = cv2.imread('image2.jpg')  # 第二张图纸图像

(2)图纸边缘切割对齐

步骤说明

    • 由于CAD图纸在制作或扫描过程中可能存在白色边缘空白区域且图像可能倾斜,需要进行边缘检测、轮廓发现或直线检测,计算最大外接矩形,确定旋转角度和中心,旋转图像,再次检测并裁剪,以去除空白区域并实现对齐。
  1. 代码实现
def edge_cutting_and_alignment(image):
    edges = cv2.Canny(image, 100, 200)
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    rect = cv2.boundingRect(max(contours, key=cv2.contourArea))
    angle = cv2.minAreaRect(max(contours, key=cv2.contourArea))[2]
    center = (rect[0] + rect[2] // 2, rect[1] + rect[3] // 2)
    rotated_image = cv2.getRotationMatrix2D(center, angle, 1.0)
    rotated_image = cv2.warpAffine(image, rotated_image, (image.shape[1], image.shape[0]))
    cropped_image = rotated_image[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]]
    return cropped_image

gray_image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray_image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
aligned_image1 = edge_cutting_and_alignment(gray_image1)
aligned_image2 = edge_cutting_and_alignment(gray_image2)

(3)高斯滤波去噪

  1. 步骤说明
    • 为提高图像质量,采用高斯滤波方法。利用高斯分布特性,给予不同像素不同权重,抑制噪声同时保留边缘和细节。
  1. 代码实现
def gaussian_filtering(image):
    return cv2.GaussianBlur(image, (3, 3), 0)

filtered_image1 = gaussian_filtering(aligned_image1)
filtered_image2 = gaussian_filtering(aligned_image2)

(4)差值比对

  1. 步骤说明
    • 通过图像减法计算两幅图像在相同位置上像素值的差异,对结果进行二值化处理,再利用滑动窗口消除因噪声或误差导致的误判,突出差异区域。
  1. 代码实现
def difference_comparison(image1, image2):
    diff = cv2.absdiff(image1, image2)
    _, binary_diff = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
    return binary_diff

diff_image = difference_comparison(filtered_image1, filtered_image2)

(5)腐蚀膨胀

步骤说明

膨胀操作

  • 由于差值比对可能产生误检或漏检情况,对差异图进行腐蚀和膨胀操作。腐蚀消除小区域内噪声或误检点,膨胀填补空洞或漏检点,提高检测准确性和稳定性。
  1. 代码实现
def erosion_and_dilation(image):
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    eroded_image = cv2.erode(image, kernel, iterations=1)
    dilated_image = cv2.dilate(eroded_image, kernel, iterations=1)
    return dilated_image

processed_image = erosion_and_dilation(diff_image)

(6)标注归一

  1. 步骤说明
    • 在原始CAD图纸上标注出不同处,对同一位置多个不同标注进行合并处理,去除多余标注,使标注简洁规范,便于观察和分析。
  1. 代码实现
def annotation_normalization(image, original_image):
    contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in of the above is just an example and may need to be adjusted according to t

部署方式

编程语言:Python
主要库:OpenCV(用于图像处理)

成功的路上没有捷径,只有不断的努力与坚持。如果你和我一样,坚信努力会带来回报,请关注我,点个赞,一起迎接更加美好的明天!你的支持是我继续前行的动力!"

"每一次创作都是一次学习的过程,文章中若有不足之处,还请大家多多包容。你的关注和点赞是对我最大的支持,也欢迎大家提出宝贵的意见和建议,让我不断进步。"

神秘泣男子

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘泣男子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值