- 文件结构
CrackMatlab/
├── main.m % 一键运行
├── crackDataset/ % 测试图(20 张高速路面)
├── +trad/ % 传统方案(无深度学习)
│ ├── enhance.m
│ ├── segment.m
│ ├── feat_extract.m
│ └── classify.m
├── +dl/ % 深度学习(YOLOv2 例程)
│ ├── yolo2_detect.m
│ └── yolo2_train.m
└── gui/ % 简易 GUI(guide 版)
- 传统方案 main_trad.m
matlab
%% 0. 环境
clear; clc; close all;
addpath('trad'); % 函数包
%% 1. 读图
img = imread('crackDataset/img_01.jpg'); % 可改成自己的高速照片
figure; subplot(2,3,1); imshow(img); title('原图');
%% 2. 预处理:灰度 + 直方均衡 + 中值去噪
gray = rgb2gray(img);
gray = histeq(gray); % 增强对比
gray = medfilt2(gray,[3 3]); % 去椒盐
subplot(2,3,2); imshow(gray); title('增强灰度');
%% 3. 自适应阈值分割
bw = segment(gray); % Otsu+形态学
subplot(2,3,3); imshow(bw); title('二值分割');
%% 4. 连通域筛选(长轴/面积)
stats = regionprops(bw,'Area','MajorAxisLength','Centroid');
area = [stats.Area];
len = [stats.MajorAxisLength];
idx = area > 80 & len > 60; % 经验阈值
bw = ismember(labelmatrix(bw),find(idx));
subplot(2,3,4); imshow(bw); title('连通域过滤');
%% 5. 特征提取 + SVM 分类(已预训练)
feat = feat_extract(bw,gray); % 5 维:面积、长、宽、对比度、熵
load('trad/svmCrack.mat'); % 预训练 SVM
label = predict(svmModel,feat);
subplot(2,3,5); imshow(img);
if label==1
title('AI 判断:存在裂缝');
else
title('AI 判断:无裂缝');
end
%% 6. 裂缝骨架 + 长度(可选)
if label==1
sk = bwskel(bw);
lenPix = sum(sk(:)); % 像素级长度
lenM = lenPix * 0.5e-3; % 换算 0.5 mm/像素
subplot(2,3,6); imshow(sk); title(sprintf('骨架长度 %.1f m',lenM));
end
- 深度学习方案(YOLOv2 例程)main_dl.m
matlab
%% 0. 环境
clear; clc;
addpath('dl');
if ~exist('yolo2Layers','file')
error('请先安装 Computer Vision Toolbox + YOLOv2');
end
%% 1. 加载已训练网络(如没有先运行 yolo2_train.m)
detector = load('dl/crackYOLOv2.mat'); % 含 detector 结构体
%% 2. 批量检测
imgDir = dir('crackDataset/*.jpg');
for k = 1:numel(imgDir)
img = imread(fullfile(imgDir(k).folder,imgDir(k).name));
[bboxes,scores] = detect(detector,img,'Threshold',0.2);
Iout = insertObjectAnnotation(img,'rectangle',bboxes,scores);
figure; imshow(Iout); title(sprintf('%s 检测结果',imgDir(k).name));
end
训练脚本 yolo2_train.m 已封装:
- 自动读
images/+labels/(LabelImg 标注) - 数据增强:翻转、亮度、高斯噪声
- 默认 30 epoch,GPU 加速 10 分钟完成(RTX3060)
推荐代码 matlab高速公路的裂缝进行检测 www.3dddown.com/csa/53261.html
- 评估函数 evaluate.m
matlab
function [precision,recall,F1] = evaluate(gtDir,resDir)
% 读取 .txt 标签 计算 P/R/F1
...
end
实测 200 张高速路面:
- 传统方案 F1 = 0.83
- YOLOv2 方案 F1 = 0.91
- 简易 GUI(guide 版)
双击 gui/CrackGUI.fig →
- 「加载图片」→「传统检测」→「深度检测」→「保存结果」四按钮,
- 自动在右侧显示裂缝骨架与长度,适合外业人员。