|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别
8 c o3 j- E- z) c0 D5 n: I: u- `8 w9 ]8 g2 k
%% 读入原始的螺纹图片, 并显示5 k' y# n/ O8 j
clear;clc;close all
+ R. Q/ b. b g% n& g, `$ ? hI=imread('screw.bmp');$ _& `; \" G6 A- G
I=rgb2gray(I);
1 [( G* n3 @* {$ }: m$ @( u6 c: B! d6 w) T8 x
figure
; _3 V3 p/ x/ ~8 H5 ~subplot(1,3,1)
/ x8 y$ N1 o2 r: c/ Uimshow(I)
4 Z. D1 O2 Q& Q' A) b0 wtitle('螺纹原图')
( E- I: n9 Q) n% U; h. e; [/ T
0 g! M3 u! P( Lset(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]); % 设置 figure 窗口的位置和尺寸
" P2 [; r y0 V( B( G! t. t7 p) O7 Q3 H) i, X3 b
%% 对螺纹图片进行滤波处理, 并执行边缘检测
$ w3 M& ^7 l) f5 v2 ^7 SI=wiener2(I,[5 5]); % 把原图里的噪声点滤去
& g y* O* H# Z* C! }6 C& K: P& |/ j
I=edge(I,'canny'); % 边缘检测, 得到螺纹的轮廓波形1 F% r8 g- R+ b/ O) H
[m,n]=size(I); % 计算图像的尺寸- s1 C% E* O" M ~2 T# c
% _, `3 k; L) ~' I8 pI=I(20:m-20,20:n-20); % 把图像的边角去掉, 仅留下有用的部分
3 F) h. g1 K% S6 ?[m,n]=size(I); % 计算去掉边角之后的图像尺寸
7 w& e7 w- j/ ]8 i
% W& S9 t7 v- l m" `subplot(1,3,2)
6 ]) c9 l) A5 o+ @! M! `- m. o: qimshow(I) % 显示去掉边角之后的图像
7 I5 D3 G1 C' F! e* x/ }: S) Ltitle('螺纹波形')+ s. ~/ _8 k4 L
: s/ }/ I5 T5 Q" `" [
%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来4 b) |1 H' h( d# r( S
N=1; % 计数器
& W' {' c3 o* Ofor i=1:m ' Z7 ?( w! o5 B v0 a: U
for j=1:n4 l4 }$ ?1 t/ C8 U1 q% d0 D
if I(i,j)==1
7 s/ A' p+ O& j x(N)=i; % 保存白色像素的横坐标 x
) `& L4 O& b" d, e3 r7 @ y(N)=j; % 保存白色像素的纵坐标 y
m& n: v2 O) L/ ^# y5 F/ d N=N+1; % 计数器 +1- X) q& f3 p" g$ Q
end* z9 |, Z1 ]* ~
end$ }" h7 e# n% _1 r* x. v
end1 k& U2 Q% A: S- J, l
+ w9 V' P ]/ N3 X& y; s [: f[x,IX]=sort(x); % 将 x 按升序排列8 G3 o) m% V" U- _1 r b8 z
y=y(IX); % 对应的 y 顺序依次和 x 对应
3 r; W% t9 v. C' X5 j, _5 J8 Z
- o) s- X" g; N9 }! D+ ^0 b; osubplot(1,3,3)
& k7 c8 v3 J! Zplot(x,y) % 绘制出螺纹轮廓波形
; {. j+ s2 A% }6 W9 L& nxlabel('横轴 x')
3 W1 o+ i) Z9 A i, @ylabel('纵轴 y')$ q [" [8 d/ H, D4 I0 J/ a
title('螺纹识别结果')) R, M# B. U/ a2 ?7 q) m' F, F
view([90 90])7 O& E6 t5 ~. D5 i3 K0 [* j4 o
hold on! ?: `; _1 s) v: @2 `9 w
axis equal
- o e$ R) ^; O8 Q, Eaxis([1 m 1 n])* H6 c7 Z1 L [
/ B. |6 v! T9 E; K: {. e7 ]$ r8 p
%% 查找螺纹轮廓上的波峰点和波谷点
) f) z: T0 Q/ U9 }M=14; % 设置螺纹的分段数7 v1 H8 t$ i( t
lengthxy=length(x); % 数据点的个数) f a" K% `* M
dlength=floor(lengthxy/M); % 将螺纹轮廓波形等分成 M 段, 每一段的长度
. `, C1 q% v5 f1 d0 x6 U* R/ C3 F" i" v |
for k=1:M
( C5 ^: k; n7 Y2 u xx{k}=x((k-1)*dlength+1:k*dlength); % 保存每一段的 x 值- I4 e# h5 O& l0 J6 n
yy{k}=y((k-1)*dlength+1:k*dlength); % 保存每一段的 y 值/ X% [: b0 w9 P8 ]$ ]' B
end
2 h9 f- z0 ?. H
$ Q6 N; _5 r. a' D3 i" w9 B9 ?for k=1:M
' E/ L) P! _) E [bofengy(k),index1]=max(yy{k}); % 寻找每一段里 y 的最大值5 |4 M8 e/ |6 h5 ]( ^( P5 ~
bofengx(k)=xx{k}(index1); % 得到与波峰对应的横坐标 x
4 S3 x& S" i9 A$ `. U [boguy(k),index2]=min(yy{k}); % 寻找每一段里 y 的最小值
# Y/ N4 z. O7 ^ \# `8 _ bogux(k)=xx{k}(index2); % 得到与波谷对应的横坐标 x# J) g/ b1 K- U# [7 L* a
end
$ H! H& I) ^& Bscatter(bofengx,bofengy) % 绘制波峰点5 k8 a9 ^0 }* g5 K
scatter(bogux,boguy,'k') % 绘制波谷点1 {' z$ {3 D5 m5 `2 h4 X) [1 a
% t$ K( U% ?& J$ d0 z4 ^3 \4 E
%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线
$ R+ Y3 v# ?! h5 w" v0 O/ y% 对波峰点进行直线拟合# P a# L8 k0 j5 M X! E0 [" e
A1=[bofengx',ones(length(bofengx),1)]; + K' a0 t0 ?. ]% C8 {
kb1=A1\bofengy';
0 v" f' p8 z& q: j$ }, gk1=kb1(1);( D* |1 V& h: x N) ?
b1=kb1(2);
; [5 b0 V# G% f* K% C7 V7 r
+ R. x4 U+ ?2 G9 P% 绘制出波峰点的拟合直线
4 K8 o. g5 f" a9 c0 k. M- ?0 ax0=[1 m];
2 [$ J: h- r" R$ _) `, [% _. T/ OY1=k1*x0+b1;
/ K4 d* P( j$ H# R7 Tplot(x0,Y1,'m');# m) ?* X+ k4 t; }( X
, o0 V! n$ U# N& [4 u% 对波谷点进行直线拟合3 E: V6 d9 S4 Q+ R+ w
A2=[bogux',ones(length(bogux),1)];) i2 `9 H, g: A7 b4 A
kb2=A2\boguy';
2 ^4 _9 @" I" ?* Z" u* hk2=kb2(1);
0 C# q, S$ A G6 c- a$ G8 `b2=kb2(2);$ { I7 E6 D+ x5 @
- h, j" K. ]& `2 j3 f% 绘制出波谷点的拟合直线! K- T; K# p m; \
x0=[1 m];. N1 q3 F" ~+ i9 k! I* i! `
Y2=k2*x0+b2;
B! m; L% I' q6 oplot(x0,Y2,'r')2 o- S D/ A; N: S1 c" R1 B) O
|
|