Skip to content

yewanyuan/Crack_Detection_Algorithm

Repository files navigation

crack-detection-algorithm

基于深度学习和计算机视觉的钻孔成像裂隙自动识别算法。

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修复还是文档完善,我们都非常欢迎您的参与!

1. 快速开始

1.1. 环境要求

依赖安装详情

Python环境:

  • Python 3.8+ (推荐 3.9+)
  • 支持Windows, macOS, Linux

核心依赖:

pip install numpy opencv-python scikit-image scipy

可选依赖(增强功能):

pip install matplotlib  # 调试可视化

1.2. 安装使用

方式一:直接运行

# 克隆或下载项目
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")
# ... 处理流程

1.3. 参数配置

python main.py \
  --input_dir data \          # 输入目录
  --output_dir results \      # 输出目录  
  --circum_mm 94.25 \        # 钻孔周长(mm)
  --depth_mm 500.0           # 孔深(mm)

1.4. 验证结果

运行成功后检查输出目录:

results/
├── image_1_mask.png      # 二值掩膜
├── image_1_overlay.jpg   # 可视化结果
├── image_2_mask.png
└── image_2_overlay.jpg

2. 架构

采用模块化设计,便于维护和扩展。

2.1. 核心模块

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
}

2.2. 使用示例

批量处理
# 基本用法
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,   # 放宽紧凑性
}

3. 技术原理

3.1. 算法流程

原始图像
    ↓
预处理 (光照矫正 + 竖条纹抑制)
    ↓  
特征增强 (Sato滤波 + Canny边缘)
    ↓
自适应分割 (Otsu阈值)
    ↓
后处理筛选 (几何特征 + 形态学)
    ↓
结果输出 (二值掩膜 + 可视化)

3.2. 核心创新点

  • 多尺度Sato滤波: 针对不同宽度裂缝的检测优化
  • 智能竖条纹过滤: 多重条件判断,避免误删真实裂缝
  • 几何特征综合筛选: 长宽比、紧凑性、规整性多重验证
  • 像素精度换算: 基于实际钻孔参数的精确测量

3.3. 性能优化

  • 梯度回退机制: scikit-image → OpenCV → 基础算法
  • 模块化设计: 便于算法组件替换和升级
  • 批处理优化: 支持大批量图像高效处理

4. 开发和贡献

4.1. 开发环境搭建

# 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/

4.2. 项目结构

crack_detection_system/
├── main.py              # 主程序入口
├── config.py            # 配置管理
├── utils.py             # 工具函数
├── preprocessing.py     # 预处理模块
├── enhancement.py       # 特征增强
├── segmentation.py      # 分割后处理  
├── visualization.py     # 可视化输出
├── example_usage.py     # 使用示例
├── README.md           # 项目文档
├── data/               # 测试数据
└── results/            # 输出结果

4.3. 贡献指南

欢迎提交Issue和Pull Request!

贡献方向:

  • 算法优化和新特征
  • 性能提升和bug修复
  • 文档改进和示例添加
  • 测试用例和基准数据

🙏 致谢

感谢所有为钻孔图像处理技术发展做出贡献的研究者和开发者!

技术支持:

  • scikit-image 社区的优秀图像处理算法
  • OpenCV 团队的计算机视觉基础库支持
  • SciPy 生态系统的数值计算能力

版本信息: v2.0 (模块化重构版)
更新时间: 2025年
开源协议: MIT License

About

An automated crack detection algorithm for borehole imaging based on deep learning and computer vision.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages