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, 图像二值化, 图像分割, 图像处理, 实线虚线分类, 工程制图, 工程图纸数字化, 形态学操作, 扫描件处理, 无后门, 栅格去除, 特征提取, 线条检测, 网络调试, 背景去除, 自动化, 计算机视觉, 边缘检测, 逆向工具, 霍夫变换