基于深度学习和计算机视觉的钻孔成像裂隙自动识别算法。
English Version | 中文版本
主要功能
💡 提示: 点击下方功能标题可展开查看详细说明
1. 预处理
自动进行图像预处理,包括光照矫正和竖条纹抑制,提升图像质量。
功能特点:
- 同态/Retinex风格光照矫正
- 自适应直方图均衡(CLAHE)
- 竖条纹智能检测与抑制
- 环形边界处理
2. 特征增强
基于Sato滤波器和Canny边缘检测的裂隙特征增强算法。
算法优势:
- Sato黑脊线检测,专门针对黑色细线裂隙
- 多尺度特征融合 (1, 2, 3, 4 像素尺度)
- Canny边缘检测补充对比度变化
- 自适应权重组合 (75% Sato + 25% Canny)
3. 分割算法
采用Otsu自适应阈值分割,自动确定最佳分割阈值。
技术特点:
- 全自动阈值选择
- 适应不同图像条件
- 支持scikit-image和OpenCV双重后备
4. 后处理
多重几何特征筛选和形态学优化,大幅减少误检测。
筛选机制:
- 长宽比筛选 (≥2.0:1)
- 面积和长度过滤
- 竖条纹智能识别与过滤
- 形状规整性检查 (solidity < 0.99)
- 紧凑性筛选 (compactness ≥ 1.2)
- 多方向形态学连接
- 短竖直特征保护机制,避免误删真实裂缝
- 像素-毫米精确换算 (周长94.25mm, 孔深500mm)
- 自适应参数调整
5. 可视化输出
生成专业的二值掩膜和叠加可视化结果。
输出格式:
- 二值掩膜PNG: 裂隙=黑色(0), 背景=白色(255)
- 叠加可视化JPG: 红色半透明标注裂隙位置
- 支持批量处理和自动命名
算法性能指标
基于实际钻孔数据测试:
- 误检测控制: 显著减少岩石纹理误识别
- 竖条纹过滤: 有效过滤泥浆/拼接线干扰
- 裂缝完整性: 保持真实裂缝的连续性和细节
- 处理速度: 单张图像(244×1350) < 2秒
以下展示对复杂裂缝网络的识别效果:
原始图像 → 处理结果
原始钻孔图像 | 裂缝检测结果 | 二值掩膜 |
---|---|---|
![]() |
![]() |
![]() |
处理效果分析:
- ✅ 裂缝网络完整识别: 成功检出主要裂缝结构和分支
- ✅ 边界精确: 裂缝边界清晰,细节保留完整
- ✅ 误检测控制: 部分岩石纹理干扰得到有效抑制
尽管已能处理一些场景,但仍存在优化空间。以下展示一个挑战性案例:
挑战案例分析
原始图像 | 当前检测结果 |
---|---|
![]() |
![]() |
存在的问题:
- 🔸 部分过检测: 某些岩石纹理仍被误识别为裂缝
- 🔸 细微裂缝遗漏: 极细的裂缝可能被过滤
- 🔸 边界模糊处理: 对比度较低的边界识别有待提升
🤝 寻求合作与改进
我们诚邀研究者和开发者共同改进算法:
- 深度学习方法: 基于CNN/Transformer的端到端检测
- 多尺度融合: 更精细的特征金字塔网络
- 域适应技术: 适应不同地质条件和成像设备
- 后处理优化: 更智能的几何特征筛选策略
- 标注数据集: 构建高质量的裂缝检测基准数据集
📧 联系方式:
- 欢迎通过 GitHub Issues 讨论技术方案
- 可提交 Pull Request 贡献代码改进
- 学术合作请通过邮件联系
💡 参与贡献: 无论是算法改进、bug修复还是文档完善,我们都非常欢迎您的参与!
依赖安装详情
Python环境:
- Python 3.8+ (推荐 3.9+)
- 支持Windows, macOS, Linux
核心依赖:
pip install numpy opencv-python scikit-image scipy
可选依赖(增强功能):
pip install matplotlib # 调试可视化
方式一:直接运行
# 克隆或下载项目
git clone <your-repo-url>
cd crack_detection_system
# 安装依赖
pip install numpy opencv-python scikit-image scipy
# 运行检测
python main.py --input_dir data --output_dir results
方式二:作为模块导入
from utils import imread_gray, estimate_px_per_mm
from preprocessing import preprocess_image
from enhancement import enhance_cracks
from segmentation import segment_and_postprocess
from visualization import make_visual_overlay
# 检测单张图像
bgr, gray = imread_gray("image.jpg")
# ... 处理流程
python main.py \
--input_dir data \ # 输入目录
--output_dir results \ # 输出目录
--circum_mm 94.25 \ # 钻孔周长(mm)
--depth_mm 500.0 # 孔深(mm)
运行成功后检查输出目录:
results/
├── image_1_mask.png # 二值掩膜
├── image_1_overlay.jpg # 可视化结果
├── image_2_mask.png
└── image_2_overlay.jpg
采用模块化设计,便于维护和扩展。
utils.py - 工具函数模块
主要功能:
- 文件IO操作和目录管理
- 图像读取和格式转换
- 数据归一化处理
- 像素-毫米精确换算
核心函数:
def imread_gray(path) # 图像读取
def normalize01(x) # 数据归一化
def estimate_px_per_mm(w, h, c_mm, d_mm) # 换算比例计算
preprocessing.py - 预处理模块
主要功能:
- 光照不均匀矫正
- 竖条纹智能抑制
- 图像质量增强
核心算法:
def illumination_correction(gray) # 光照矫正
def suppress_vertical_stripes(gray) # 竖条纹抑制
def preprocess_image(gray_img) # 完整预处理流程
enhancement.py - 特征增强模块
主要功能:
- Sato黑脊线检测
- Canny边缘检测
- 多特征融合算法
算法参数:
- Sato尺度: (1, 2, 3, 4) 像素
- 权重分配: 75% Sato + 25% Canny
- Canny阈值: low=0.1, high=0.3
segmentation.py - 分割后处理模块
主要功能:
- Otsu自适应阈值分割
- 多重几何特征筛选
- 形态学优化处理
筛选条件:
- 最小长度: 5mm (可配置)
- 宽度阈值: 1.0mm (可配置)
- 长宽比: ≥2.0:1
- 形状规整性: solidity < 0.99
- 紧凑性: compactness ≥ 1.2
visualization.py - 可视化模块
主要功能:
- 结果叠加可视化
- 多格式文件保存
- 颜色和透明度配置
输出规格:
- 掩膜格式: PNG, 8位灰度
- 叠加格式: JPG, 24位彩色
- 默认颜色: 红色 (0,0,255)
- 透明度: 60%
config.py - 配置管理模块
配置分类:
# 钻孔几何参数
BOREHOLE_CONFIG = {
'circumference_mm': 94.25,
'depth_mm': 500.0
}
# 算法参数
ENHANCEMENT_CONFIG = {
'sato_sigmas': (1, 2, 3, 4),
'sato_weight': 0.75,
'canny_weight': 0.25
}
# 后处理参数
POSTPROCESSING_CONFIG = {
'min_length_mm': 5.0,
'width_mm_threshold': 1.0,
'aspect_ratio_threshold': 2.0
}
批量处理
# 基本用法
python main.py --input_dir ./images --output_dir ./results
# 自定义参数
python main.py \
--input_dir /path/to/images \
--output_dir /path/to/results \
--circum_mm 100.0 \
--depth_mm 600.0
输出统计:
找到 4 张图片,开始处理...
输出目录: results
钻孔参数: 周长=94.25mm, 孔深=500.0mm
------------------------------------------------------------
处理图片 1/4: image1.jpg
尺寸: 244x1350, 像素/毫米: X=2.59, Y=2.70
结果已保存: results/image1_mask.png, results/image1_overlay.jpg
------------------------------------------------------------
处理完成! 成功: 4/4
模块化调用
# example_usage.py 完整示例
from utils import imread_gray, estimate_px_per_mm
from preprocessing import preprocess_image
from enhancement import enhance_cracks
from segmentation import segment_and_postprocess
from visualization import make_visual_overlay
def detect_cracks_in_image(image_path):
# 1. 读取图像
bgr_img, gray_img = imread_gray(image_path)
h, w = gray_img.shape
# 2. 计算换算比例
_, _, px_per_mm = estimate_px_per_mm(w, h, 94.25, 500.0)
# 3. 完整处理流程
preprocessed = preprocess_image(gray_img)
prob_map = enhance_cracks(preprocessed)
crack_mask = segment_and_postprocess(prob_map, px_per_mm)
overlay = make_visual_overlay(bgr_img, crack_mask)
return bgr_img, crack_mask, overlay
# 使用示例
original, mask, result = detect_cracks_in_image("test.jpg")
print(f"检测到的裂缝像素数: {np.sum(mask)}")
参数自定义
修改 config.py
实现个性化配置:
# 调整算法敏感度
ENHANCEMENT_CONFIG = {
'sato_weight': 0.8, # 提高Sato权重
'canny_weight': 0.2, # 降低Canny权重
}
# 调整筛选严格度
POSTPROCESSING_CONFIG = {
'min_length_mm': 3.0, # 降低长度要求
'aspect_ratio_threshold': 1.5, # 放宽长宽比
'compactness_threshold': 1.0, # 放宽紧凑性
}
原始图像
↓
预处理 (光照矫正 + 竖条纹抑制)
↓
特征增强 (Sato滤波 + Canny边缘)
↓
自适应分割 (Otsu阈值)
↓
后处理筛选 (几何特征 + 形态学)
↓
结果输出 (二值掩膜 + 可视化)
- 多尺度Sato滤波: 针对不同宽度裂缝的检测优化
- 智能竖条纹过滤: 多重条件判断,避免误删真实裂缝
- 几何特征综合筛选: 长宽比、紧凑性、规整性多重验证
- 像素精度换算: 基于实际钻孔参数的精确测量
- 梯度回退机制: scikit-image → OpenCV → 基础算法
- 模块化设计: 便于算法组件替换和升级
- 批处理优化: 支持大批量图像高效处理
# 1. 克隆项目
git clone <repo-url>
cd crack_detection_system
# 2. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或 venv\Scripts\activate # Windows
# 3. 安装开发依赖
pip install -r requirements-dev.txt
# 4. 运行测试
python -m pytest tests/
crack_detection_system/
├── main.py # 主程序入口
├── config.py # 配置管理
├── utils.py # 工具函数
├── preprocessing.py # 预处理模块
├── enhancement.py # 特征增强
├── segmentation.py # 分割后处理
├── visualization.py # 可视化输出
├── example_usage.py # 使用示例
├── README.md # 项目文档
├── data/ # 测试数据
└── results/ # 输出结果
欢迎提交Issue和Pull Request!
贡献方向:
- 算法优化和新特征
- 性能提升和bug修复
- 文档改进和示例添加
- 测试用例和基准数据
感谢所有为钻孔图像处理技术发展做出贡献的研究者和开发者!
技术支持:
- scikit-image 社区的优秀图像处理算法
- OpenCV 团队的计算机视觉基础库支持
- SciPy 生态系统的数值计算能力
版本信息: v2.0 (模块化重构版)
更新时间: 2025年
开源协议: MIT License