I = imread('a.jpg');
figure,imshow(I,[])
title('原图')
I = rgb2gray(I);
figure,imshow(I,[])
title('灰度图')
I = double(I);
[height,width] = size(I);
J = I;
conv = zeros(5,5);%高斯卷积核
sigma = 1;
sigma_2 = sigma * sigma;
sum = 0;
for i = 1:5
for j = 1:5
conv(i,j) = exp((-(i - 3) * (i - 3) - (j - 3) * (j - 3)) / (2 * sigma_2)) / (2 * 3.14 * sigma_2);%高斯公式
sum = sum + conv(i,j);
end
end
conv = conv./sum;
%对图像实施高斯滤波
for i = 1:height
for j = 1:width
sum = 0;
for k = 1:5
for m = 1:5
if (i - 3 + k) > 0 && (i - 3 + k) <= height && (j - 3 + m) > 0 && (j - 3 + m) < width
sum = sum + conv(k,m) * I(i - 3 + k,j - 3 + m);
end
end
end
J(i,j) = sum;
end
end
figure,imshow(J,[])
title('高斯滤波后的结果')
%求梯度
dx = zeros(height,width);
dy = zeros(height,width);
d = zeros(height,width);
%d = J;
for i = 1:height - 1
for j = 1:width - 1
dx(i,j) = J(i,j + 1) - J(i,j);
dy(i,j) = J(i + 1,j) - J(i,j);
d(i,j) = sqrt(dx(i,j) * dx(i,j) + dy(i,j) * dy(i,j));
end
end
figure,imshow(d,[])
title('求梯度后的结果')
%局部非极大值抑制
K = d;
for j = 1:width
K(1,j) = 0;
end
for j = 1:width
K(height,j) = 0;
end
for i = 2:width - 1
K(i,1) = 0;
end
for i = 2:width - 1
K(i,width) = 0;
end
for i = 2:height - 1
for j = 2:width - 1
if d(i,j) == 0
K(i,j) = 0;
else
gradX = dx(i,j);%当前点x方向导数
gradY = dy(i,j);%当前点y方向导数
gradTemp = d(i,j);%当前点梯度
%如果Y方向幅度值较大
if abs(gradY) > abs(gradX)
weight = abs(gradX) / abs(gradY);%权重
grad2 = d(i - 1,j);
grad4 = d(i + 1,j);
%如果x、y方向导数符号相同
%像素点位置关系
%g1 g2
% C
% g4 g3
if gradX * gradY > 0
grad1 = d(i - 1,j - 1);
grad3 = d(i + 1,j + 1);
else
%如果x、y方向导数符号反
%像素点位置关系
% g2 g1
% C
%g3 g4
grad1 = d(i - 1,j + 1);
grad3 = d(i + 1,j - 1);
end
%如果X方向幅度值较大
else
weight = abs(gradY) / abs(gradX);%权重
grad2 = d(i,j - 1);
grad4 = d(i,j + 1);
%如果x、y方向导数符号相同
%像素点位置关系
%g3
%g4 C g2
% g1
if gradX * gradY > 0
grad1 = d(i + 1,j + 1);
grad3 = d(i - 1,j - 1);
else
%如果x、y方向导数符号反
%像素点位置关系
% g1
%g4 C g2
%g3
grad1 = d(i - 1,j + 1);
grad3 = d(i + 1,j - 1);
end
end
%利用grad1-grad4对梯度进行插值
gradTemp1 = weight * grad1 + (1 - weight) * grad2;
gradTemp2 = weight * grad3 + (1 - weight) * grad4;
if gradTemp >= gradTemp1 && gradTemp >= gradTemp2
K(i,j) = gradTemp;
else
K(i,j) = 0;
end
end
end
end
figure,imshow(K,[])
title('非极大值抑制后的结果')
MIN = 12;
MAX = MIN * 2;
Large = zeros(height,width);
Betueen = zeros(height,width);
for i = 1:height
for j = 1:width
if K(i,j) >= MAX%小于小阈值,不可能为边缘点
Large(i,j) = K(i,j);
else if K(i,j) >= MIN
Betueen(i,j) = K(i,j);
end
end
end
end
figure,imshow(Large,[]);
MAXSIZE = 999999;
Queue = zeros(MAXSIZE,2);%用数组模拟队列
front = 1;
rear = 1;
edge = zeros(height,width);
for i = 2:height
for j = 4:width
if Large(i,j) > 0
Queue(rear,1) = i;
Queue(rear,2) = j;
rear = rear + 1;
edge(i,j) = Large(i,j);
Large(i,j) = 0;
end
while front ~= rear
temp_i = Queue(front,1);
temp_j = Queue(front,2);
front = front + 1;
%8-连通域寻找可能的边缘点
if Betueen(temp_i - 1,temp_j - 1) > 0
Large(temp_i - 1,temp_j - 1) = K(temp_i - 1,temp_j - 1);
Betueen(temp_i - 1,temp_j - 1) = 0;
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
if Betueen(temp_i - 1,temp_j) > 0
Large(temp_i - 1,temp_j) = K(temp_i - 1,temp_j);
Betueen(temp_i - 1,temp_j) = 0;
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j;
rear = rear + 1;
end
if Betueen(temp_i - 1,temp_j + 1) > 0
Large(temp_i - 1,temp_j + 1) = K(temp_i - 1,temp_j + 1);
Betueen(temp_i - 1,temp_j + 1) = 0;
%入队
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
if Betueen(temp_i,temp_j - 1) > 0
Large(temp_i,temp_j - 1) = K(temp_i,temp_j - 1);
Betueen(temp_i,temp_j - 1) = 0;
Queue(rear,1) = temp_i;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
if Betueen(temp_i,temp_j + 1) > 0
Large(temp_i,temp_j + 1) = K(temp_i,temp_j + 1);
Betueen(temp_i,temp_j + 1) = 0;
Queue(rear,1) = temp_i;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
if Betueen(temp_i + 1,temp_j - 1) > 0
Large(temp_i + 1,temp_j - 1) = K(temp_i + 1,temp_j - 1);
Betueen(temp_i + 1,temp_j - 1) = 0;
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
if Betueen(temp_i + 1,temp_j) > 0
Large(temp_i + 1,temp_j) = K(temp_i + 1,temp_j);
Betueen(temp_i + 1,temp_j) = 0;
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j;
rear = rear + 1;
end
if Betueen(temp_i + 1,temp_j + 1) > 0
Large(temp_i + 1,temp_j + 1) = K(temp_i + 1,temp_j + 1);
Betueen(temp_i + 1,temp_j + 1) = 0;
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
end
i
j
end
end
figure,imshow(edge,[])
title('双阈值后的结果')
没有合适的资源?快使用搜索试试~ 我知道了~
Matlab路面裂缝识别
共2个文件
m:1个
jpg:1个
3星 · 超过75%的资源 需积分: 46 346 下载量 184 浏览量
2016-08-13
14:01:09
上传
评论 37
收藏 56KB ZIP 举报
温馨提示
简单的路面裂缝识别,基于matlab
资源推荐
资源详情
资源评论
收起资源包目录
路面裂缝识别.zip (2个子文件)
canny.m 8KB
a.jpg 54KB
共 2 条
- 1
资源评论
- zjykhol2018-05-06下不下来啊、
- weixin_383962182018-06-21还可以哦不错
- 悠悠石中竹2018-07-01该方法刚试用过,先灰度化(rgb2gray)、graythresh(求灰度阈值)、二值化(im2bw)、边缘检测(edge,用canny)即可,效果也一样,速度还比该方法快。
- STURobotic2020-04-02这么粗的裂缝检测出来的结果都不准确,不要说其他了
- qq_419302092019-04-06试了一下还不错,值得借鉴
恨天杀
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功