|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别" M$ O4 N: K& r" Z
# v* t* ?5 q2 C7 _6 s+ O5 X% L+ D
%% 读入原始的螺纹图片, 并显示! M. S) L7 r% g4 z* |
clear;clc;close all' `* S3 R& C& b# c% _% C2 u1 `
I=imread('screw.bmp');
# v; \' K* {. X+ E# XI=rgb2gray(I);9 D, H$ H: u3 I: @/ l' ]9 \1 D% ]
1 M9 Q0 u$ ~% F8 K9 tfigure
- Y4 T/ {) P. l& t4 S& tsubplot(1,3,1)
4 W* \1 @5 @! T1 Z; `* }6 Pimshow(I)7 \& G# J$ p, L1 K
title('螺纹原图'): y' n' z2 V# Z' u9 O! M
. M. l" L+ ?: x7 e W! e# uset(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]); % 设置 figure 窗口的位置和尺寸; |; W5 i }- x" J/ j" R# e5 Q
) \/ t& {0 W5 V1 @- R- N; q& t
%% 对螺纹图片进行滤波处理, 并执行边缘检测' l6 J y' c% j! Y0 T: ?
I=wiener2(I,[5 5]); % 把原图里的噪声点滤去
( w+ K, @. ~' U
3 N T4 y7 R9 T! l6 }, qI=edge(I,'canny'); % 边缘检测, 得到螺纹的轮廓波形- g X7 w+ Y2 X( |$ T
[m,n]=size(I); % 计算图像的尺寸
; _5 w+ l% B3 N! ]6 P5 n6 \3 O6 y5 L. {/ J" W3 m
I=I(20:m-20,20:n-20); % 把图像的边角去掉, 仅留下有用的部分& N/ @4 l5 j+ M. r/ u5 H- Q% j
[m,n]=size(I); % 计算去掉边角之后的图像尺寸
6 B |! x" `0 F9 n; V/ e- r- e. }$ ~0 u8 `
subplot(1,3,2)
" T: o% n( P6 I& K5 Limshow(I) % 显示去掉边角之后的图像
6 X8 n* i/ t( \) u4 H0 ]6 `title('螺纹波形')
9 s3 x0 d6 }& v6 \# f% w
1 S) F8 X4 @2 N/ S4 \5 A' m1 d2 l9 ^%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来2 D/ \: g; D/ u9 |
N=1; % 计数器& P6 `9 ]( b; Q2 z2 }! R" h: w8 p
for i=1:m
# s& ~6 Q- R p! ]7 B4 D for j=1:n
+ W5 q. d% E: k! J; D c( V3 D2 N if I(i,j)==1
( p7 U0 W" P$ s/ ^ x(N)=i; % 保存白色像素的横坐标 x K( P( l6 e! X) Q/ @& M1 j: W
y(N)=j; % 保存白色像素的纵坐标 y$ ~$ ^, P X6 i6 n5 e
N=N+1; % 计数器 +1! D+ ~2 ~( M2 J+ t: v
end0 S' ?: b) J: I' D
end
! `- S0 D. m( _, u$ v! send
" V! d7 p4 \9 V4 d" j$ g4 Q- T
0 \! p* O9 G# H8 G[x,IX]=sort(x); % 将 x 按升序排列
2 p( J% ~0 ]) G5 O( ~y=y(IX); % 对应的 y 顺序依次和 x 对应 z4 \: ^# g2 q: Y
3 F- i4 T; @ ^" C5 s
subplot(1,3,3)
% x5 S: I$ V! L i* J( N+ r8 Pplot(x,y) % 绘制出螺纹轮廓波形
; e4 A2 E- c$ J" ]+ b) A! cxlabel('横轴 x')
/ ?$ r8 \7 I u; O, ~6 Zylabel('纵轴 y')0 E. \3 i! d9 V4 \6 I; F( X/ Z5 U
title('螺纹识别结果')
( |. k& a: _8 G# X7 B/ Wview([90 90])
! ~' a; y7 S9 d! j: I9 _* ~hold on9 v8 T9 v S+ n. u" l
axis equal# t9 n% @9 Q# N
axis([1 m 1 n])
9 P0 y B! Y3 f$ d/ i; J5 q! c1 C) \7 z# N5 g8 J) }8 d0 S9 J* M
%% 查找螺纹轮廓上的波峰点和波谷点5 o$ E5 }$ |8 T4 r
M=14; % 设置螺纹的分段数7 f2 n9 c5 n2 ?( v9 [- ?6 O
lengthxy=length(x); % 数据点的个数
1 d* e' Q; q0 A( q6 F- V$ D! k8 ^dlength=floor(lengthxy/M); % 将螺纹轮廓波形等分成 M 段, 每一段的长度# A+ o) [9 x2 H8 l. S6 z: R
! ~% D# F7 z2 |0 Y0 S" Efor k=1:M
& g' |( s! ~2 q/ D& X1 P2 G xx{k}=x((k-1)*dlength+1:k*dlength); % 保存每一段的 x 值2 L$ Z" N! f, A
yy{k}=y((k-1)*dlength+1:k*dlength); % 保存每一段的 y 值5 A J! R: f( v0 Q
end- q" O0 G% {' x1 S
$ ?- @! t9 U6 x2 N8 gfor k=1:M7 p; c) e3 ?* R5 \9 o
[bofengy(k),index1]=max(yy{k}); % 寻找每一段里 y 的最大值4 n/ _/ ~# t2 c: X n
bofengx(k)=xx{k}(index1); % 得到与波峰对应的横坐标 x
: p9 A; G- } K& Z- S' K [boguy(k),index2]=min(yy{k}); % 寻找每一段里 y 的最小值6 @5 H' W" h2 W
bogux(k)=xx{k}(index2); % 得到与波谷对应的横坐标 x
( w; s; N# ?7 G% e8 Cend3 m) y5 f: T: I+ y5 F1 C# G
scatter(bofengx,bofengy) % 绘制波峰点6 ^1 ~8 S" a X& Y
scatter(bogux,boguy,'k') % 绘制波谷点
# Q9 O3 b6 O6 W# B0 o# x7 i- g8 [5 J/ B' U0 T
%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线, P/ H5 R9 `' G+ @9 L& ^
% 对波峰点进行直线拟合; n) w& Z0 x" C5 T: m Z& v% ~
A1=[bofengx',ones(length(bofengx),1)]; : k6 [% R: H* U1 H& p/ U+ [
kb1=A1\bofengy';8 g! m G2 h N
k1=kb1(1);4 a; Q" Z0 ~4 [, L* K
b1=kb1(2);
( |0 P% b$ Z9 ~( V% v! @& G3 g3 C8 E! o1 w# x/ J
% 绘制出波峰点的拟合直线
3 F0 l, w1 G6 \ Xx0=[1 m];6 J- a `3 F6 R# P' d- ` |! W
Y1=k1*x0+b1;
. R2 s1 ?$ U0 h# Yplot(x0,Y1,'m');
. ^4 X" U+ Z& _* l" k) G, s7 b% \# ~8 p7 T s
% 对波谷点进行直线拟合
, T( K0 ^ l7 d; iA2=[bogux',ones(length(bogux),1)];! V, D' {% v& \4 c6 E4 L5 g6 g
kb2=A2\boguy';$ h* H$ g5 T+ F& d) y
k2=kb2(1);
7 w& O) o/ [" |! f' w* u w& Nb2=kb2(2);
1 h3 S% j: O5 ], @3 B
0 X4 s x# H* f& M2 v2 C% 绘制出波谷点的拟合直线
" _ p; a* _# ]( N+ j' j0 v3 Qx0=[1 m];! I/ O f* |) P1 W+ I0 z8 q
Y2=k2*x0+b2; + @6 j( v a% [, ^ E
plot(x0,Y2,'r')! y; B/ _2 p/ @2 ]- v4 q( m
|
|