bhushangolani/Line-detection-in-Engineering-drawing

GitHub: bhushangolani/Line-detection-in-Engineering-drawing

基于 OpenCV 和霍夫变换的工程图纸线条检测与分类工具,可自动去除网格背景并区分实线与虚线。

Stars: 1 | Forks: 1

# 工程图纸中的线条检测 一个**计算机视觉**流水线,用于通过移除背景网格/栅格,检测并分类扫描工程图纸中的**实线**和**虚线**,从而实现数字化。基于 OpenCV 和 Python 构建。 ## 概述 扫描的工程图纸通常包含会遮盖线条特征的网格或栅格背景。本项目对此类图像进行预处理,使用聚类和阈值化方法移除网格,并应用边缘检测,随后通过**霍夫变换** 检测线条,并在视觉上区分实线(如物体轮廓)和虚线(如隐藏线或构造线)。 ## 功能 - 将图像**自动分割**为问题和答题区域 - 通过对像素强度的 **K-means 聚类** (K=2) 移除问题区域的网格,以将网格与内容分离 - 对答题区域中较浅的图形进行**基于阈值的清理** - **Canny 边缘检测**,采用基于图像中值的自动阈值估算 - **形态学操作** (膨胀 + 腐蚀) 以降低噪声并连接断裂的边缘 - **概率霍夫变换** 检测线段并根据长度进行分类(长 → 实线,短 → 虚线) - **可视化输出**:实线显示为红色,虚线显示为绿色 ## 流水线 1. **加载与预处理** — 读取图像,转换为灰度图。 2. **裁剪与分割** — 使用固定的裁剪边界将图像分为上部(问题)和下部(答题)区域。 3. **问题区域** — 对像素强度应用 K-means (K=2) 以分割并移除网格;保留对应绘图内容的聚类。 4. **答题区域** — 应用二值化阈值处理以抑制网格(对于非常浅的图形,可能会残留一些噪声)。 5. **合并** — 将两个处理后的区域拼接成单张图像并进行二值化。 6. **边缘检测** — 高斯模糊,然后使用自动计算的低/高阈值进行 Canny 检测。 7. **边缘清理** — 膨胀和腐蚀,以平滑边缘图并去噪。 8. **线条检测** — 分两轮通过 `cv2.HoughLinesP` 检测:较长的线段 → 实线(红色),较短的线段 → 虚线(绿色)。 ## 环境要求 - Python 3.x - OpenCV (`opencv-python`) - NumPy - Matplotlib (用于可选的绘图) - scikit-learn (已导入;主要逻辑使用 OpenCV 的 K-means) 该脚本是在 **Google Colab** 中开发的,并使用 `google.colab.patches.cv2_imshow` 进行显示。若在本地运行,请将 `cv2_imshow(...)` 替换为 `cv2.imshow(...)` 和 `cv2.waitKey(0)`,或使用 `matplotlib.pyplot.imshow`。 ## 用法 1. 克隆仓库: git clone https://github.com/bhushangolani/Line-detection-in-Engineering-drawing.git cd Line-detection-in-Engineering-drawing 2. 安装依赖: pip install opencv-python numpy matplotlib scikit-learn 3. 在 `LINE_DETECTION.py` 中,设置工程图纸图像的路径: img = cv2.imread('/path/to/your/engineering_drawing.jpg') 4. 根据需要调整裁剪坐标(默认在 850–1800 行分割问题区域,1800–末尾分割答题区域): im1 = copy_gray[850:1800, 500:width] # question region im2 = copy_gray[1800:height, 500:width] # answer region 5. 运行脚本 (在 Colab 中或在本地更换显示调用后): python LINE_DETECTION.py ## 项目结构 ``` . ├── LINE_DETECTION.py # Main pipeline: mesh removal, edge detection, Hough lines ├── README.md ├── image.jpg # Example input (if present) └── Output Example.PNG # Example output with detected lines ``` ## 技术说明 - **K-means (K=2)** 假设网格和绘图位于两个不同的强度聚类中;平均强度较低的聚类通常是网格。 - **Hough 参数** (`threshold`, `minLineLength`, `maxLineGap`) 控制灵敏度。当前设置对长(实)线使用较严格的参数,对短(虚)线段使用较宽松的参数。 - **裁剪边界** (850, 1800, 500) 是针对特定文档布局调整的;针对不同的页面格式请进行修改。 ## 作者 **Bhushan Golani** 项目:工程图纸数字化 (计算机视觉 · Prof. Kaushal Bhagat) ## 许可证 本项目是开源的,可用于教育目的。
标签:Canny边缘检测, K-means聚类, OpenCV, Python, 图像二值化, 图像分割, 图像处理, 实线虚线分类, 工程制图, 工程图纸数字化, 形态学操作, 扫描件处理, 无后门, 栅格去除, 特征提取, 线条检测, 网络调试, 背景去除, 自动化, 计算机视觉, 边缘检测, 逆向工具, 霍夫变换