|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别' d9 w% t' \! z% m
# |' f6 Q; X& S%% 读入原始的螺纹图片, 并显示: w$ D" G4 u; v) Z; @3 j+ t0 f
clear;clc;close all
9 Z8 R% u& r4 ZI=imread('screw.bmp');' g7 I$ H2 p; m C" W! h/ c
I=rgb2gray(I);
- j! A, u `$ M6 ?
" b3 d- s& o7 a% y tfigure
2 e, {# s2 Z* f* E: q( usubplot(1,3,1)
# Z4 W' Y0 L- ]( ]imshow(I)3 b& A( `0 }0 K$ u9 h& p' Q, p
title('螺纹原图'): h e8 r' P3 M% E! y T: c: C
0 c6 C" ]( `, \0 ~) C
set(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]); % 设置 figure 窗口的位置和尺寸
" U6 ^1 R7 H' |& N; D. b: h* x
& u% b, F+ D. u8 `6 J1 n%% 对螺纹图片进行滤波处理, 并执行边缘检测: r7 q9 c ?$ o
I=wiener2(I,[5 5]); % 把原图里的噪声点滤去
: q6 C& O" ]$ m8 t: ]+ J# ]3 ?% J$ ?) P- S: t4 q9 ^/ l
I=edge(I,'canny'); % 边缘检测, 得到螺纹的轮廓波形
6 E3 t4 |5 E1 Y. W0 ]5 h5 i ~[m,n]=size(I); % 计算图像的尺寸( H, _$ `$ r5 h0 t- p
+ u, p. u5 w/ O* j4 j+ K% s
I=I(20:m-20,20:n-20); % 把图像的边角去掉, 仅留下有用的部分" l4 \& @, S9 R8 w3 N/ `2 u
[m,n]=size(I); % 计算去掉边角之后的图像尺寸' s0 n$ b' d8 g
' k% d! T( q: ~& V8 Z( Z# T% J
subplot(1,3,2)
7 ], s2 `% w% G9 m& k9 F' Zimshow(I) % 显示去掉边角之后的图像( B1 Q9 z" a; `5 r, d
title('螺纹波形')
9 ?) Z/ t3 A/ }' _# P$ m& q
3 z* k2 t+ i/ W. N5 J% f%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来% c8 c) w5 Z Q
N=1; % 计数器2 r0 O6 W4 S; M7 A# l
for i=1:m
( K0 @; e! t5 n9 x4 ^$ t3 X6 R for j=1:n
: T0 b C3 m$ d0 {3 `- @% L+ E if I(i,j)==1 ) d/ e& A1 T3 D4 Z& h$ U1 E
x(N)=i; % 保存白色像素的横坐标 x! A% x# s- v# @* ~
y(N)=j; % 保存白色像素的纵坐标 y; l! W. s0 y/ b
N=N+1; % 计数器 +1
/ b7 b3 O8 q6 A2 W end4 Y' N# r" U( b" M
end: `5 {4 ?; d1 g1 H
end0 x2 u' W8 u$ e( O `7 j
, G+ G, v) P/ R* @
[x,IX]=sort(x); % 将 x 按升序排列, M* t- U# }% @+ f4 ~! }
y=y(IX); % 对应的 y 顺序依次和 x 对应4 J, J' q: q& D- B. d g: j; L [5 q
" D: M! i z; u, }3 Y
subplot(1,3,3)
; q% X6 `1 Z3 y# A( u* W# Nplot(x,y) % 绘制出螺纹轮廓波形( M2 ?& }4 D- Z' ]" F: |) h
xlabel('横轴 x') ; i8 x6 i6 k6 E5 X! a
ylabel('纵轴 y')
% X9 u* f: C$ c. Z9 Mtitle('螺纹识别结果')2 ~% A$ F# ]3 |* U
view([90 90])0 i) t5 i; ~# W/ _- E) z& T6 ?
hold on" q, ~0 N: @& ~( E1 Q c
axis equal- x! F! e, _! N6 R$ q
axis([1 m 1 n])
! X/ H4 \6 ?/ S9 N, {* V6 U
' N. i* f& l. j" X- f2 ?%% 查找螺纹轮廓上的波峰点和波谷点
0 K1 u6 m; l9 h, |M=14; % 设置螺纹的分段数/ H, M% \: C: ^. S0 P; S
lengthxy=length(x); % 数据点的个数: B+ k; b$ b5 b4 A; j0 C2 @7 K& }
dlength=floor(lengthxy/M); % 将螺纹轮廓波形等分成 M 段, 每一段的长度6 l" i* h% u% V1 W% A% d5 u% ~/ r
& h4 r3 ~! P# h8 u8 [for k=1:M" F7 {. R& Q+ j+ ~( n
xx{k}=x((k-1)*dlength+1:k*dlength); % 保存每一段的 x 值8 |0 p7 @1 O, j0 A8 q
yy{k}=y((k-1)*dlength+1:k*dlength); % 保存每一段的 y 值! T. u8 c& L1 T2 U( F" X
end7 w- J9 b0 Y& |4 V# m
. ?4 V( O5 G' S. Q
for k=1:M3 }. i8 M9 S) c; \& y; d! j
[bofengy(k),index1]=max(yy{k}); % 寻找每一段里 y 的最大值
. u$ `. K! H* Y% J: ]9 }7 |, F8 [0 Q bofengx(k)=xx{k}(index1); % 得到与波峰对应的横坐标 x
: r- u7 t1 V) N% f% s [boguy(k),index2]=min(yy{k}); % 寻找每一段里 y 的最小值
6 F3 z+ c! o% N5 j/ W! Y- L+ e bogux(k)=xx{k}(index2); % 得到与波谷对应的横坐标 x
2 h1 ^/ }8 ~% eend& H; z9 U( G3 S- M
scatter(bofengx,bofengy) % 绘制波峰点/ a, Z/ n) B% |. G* I
scatter(bogux,boguy,'k') % 绘制波谷点
: f0 @" e- q. C$ ^$ U* }0 v/ i0 j- b8 v. V
' M, h8 x' T' n" M%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线
2 t1 Q' x U3 Q% ~% 对波峰点进行直线拟合
/ ~7 U( @* y) J0 h& o5 SA1=[bofengx',ones(length(bofengx),1)]; 0 u1 N, L7 M" H2 A4 x
kb1=A1\bofengy';
' j3 X; w2 j' h: w! v) nk1=kb1(1);
& D( }0 I" q/ K. D. {b1=kb1(2);& }, t, ^1 J) y' }/ ]1 m% X
4 @/ s* D. V. J) r/ m- x% 绘制出波峰点的拟合直线
1 l* }5 V/ K5 T) |/ ?7 _) N8 yx0=[1 m];
% o: r( q3 K, w- nY1=k1*x0+b1;
+ G1 H/ J5 \# Z5 N5 uplot(x0,Y1,'m');
+ f. B! A% ?- h& Z4 B2 b: R
# H, N0 F: T* _- N% 对波谷点进行直线拟合$ }* h+ i" {! F/ D o4 S, }
A2=[bogux',ones(length(bogux),1)];
$ e3 L- p* ]+ X- b2 K6 L( lkb2=A2\boguy';
+ ^' N6 i+ U5 e1 v+ n5 X% Nk2=kb2(1);
. X3 d6 J5 U3 l/ w/ nb2=kb2(2);' i) q- o& u& u4 e, N; _5 Q
* |9 `5 |4 o( z; K' r4 o( L L
% 绘制出波谷点的拟合直线
% Q% H0 P; B" d4 Hx0=[1 m];
/ w/ s$ m( Y# q& ]1 e1 mY2=k2*x0+b2; . j& x$ L" b4 j& r
plot(x0,Y2,'r'), N0 o+ d) A z' t% v
|
|