前两天的《机器视觉与自动检测》老师留了一道练习题,检测下图中亮块的角度。
基本方法是边缘检测->hough变换检测直线->houghpeaks检测峰值->houghlines检测直线
clc,close
BW=imread('C:\Users\10493\Desktop\钻石角度测量.bmp');%文件路径
BW= edge(BW,'LOG',0.01)%采用LOG滤波
figure(1),imshow(BW,[]);title('canny 边缘检测');
[H,T,R]= hough(BW,'ThetaRes',1,'RhoRes',3);%hough变换,ThetaRes轴变换间隔为1
%imshow(theta,rho,H,[],'notruesize'),
axis on,
axis normal
%xlabel('\theta'),ylabel('rho');
P=houghpeaks(H,8,'threshold',ceil(0.25*max(H(:))));%检测投票结果,制定8个特征,阈值为0.25*最大值
hold on
lines=houghlines(BW,T,R,P,'FillGap',15,'MinLength',102);%检测直线,小于15,两直线合并,检测直线最短长度102
figure,imshow(BW,[]),title('Hough Transform Detect Result'),
hold on
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',4,'Color',[.6 .7 .8]);
end
a=[lines.theta];%取出struct中theta
a1=abs(a(6)-a(3));
a2=abs(a(5)-a(7));
a3=abs(a(8)-a(2));
a4=abs(a(1)-a(4));%此处因为检测顺序和表示顺序不同,所以手动计算。
基本思路如上,重要的是要根据不同的滤波结果,合理的设置诸如ThetaRes、RhoRes、FillGap、MinLength等参数。上述参数具体作用Matlab帮助文档里写的很详细。在此不再赘述。