|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别6 u( v1 o1 ?: m# g& E1 I- S
9 s. j4 v3 |7 u# ^+ n%% 读入原始的螺纹图片, 并显示2 M+ D; ~7 I' r4 O- Y
clear;clc;close all
2 E2 S5 W+ L( M8 y) G$ BI=imread('screw.bmp');+ e( }+ N2 G' x" w- E+ C& i
I=rgb2gray(I);
$ r+ w# \7 P8 G( L1 D1 F0 J
7 l$ }. r c4 r# o4 Z. gfigure% s4 y: q$ X( b6 p1 a& ?
subplot(1,3,1)
4 Q W7 d0 r4 |4 ?9 S9 Y/ fimshow(I)
+ r& g) C$ }9 S: R2 m! ztitle('螺纹原图')
* o, d2 P b# i9 H/ P2 y
7 b& k- Q- Y, W Cset(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]); % 设置 figure 窗口的位置和尺寸
4 }* c G0 B: B) a( H- E: Z( h" D& a' f# A
%% 对螺纹图片进行滤波处理, 并执行边缘检测( N0 q/ ?+ v- k* g# B9 j. m
I=wiener2(I,[5 5]); % 把原图里的噪声点滤去6 j/ f3 F8 Q* ~1 F2 X
" s& l. B) R3 n) {* X4 k8 _I=edge(I,'canny'); % 边缘检测, 得到螺纹的轮廓波形
/ h* R/ _2 T+ g6 p[m,n]=size(I); % 计算图像的尺寸& H! K, m5 Q7 I
2 @: f! n' s' W' ^" z& VI=I(20:m-20,20:n-20); % 把图像的边角去掉, 仅留下有用的部分4 x( z. X; u% ], y7 w
[m,n]=size(I); % 计算去掉边角之后的图像尺寸
# T: H1 N- x- k$ g2 N" }! w- M/ j) W6 F+ f% N8 W
subplot(1,3,2)
4 u& v0 ]! c7 t! S5 Z0 z% w7 vimshow(I) % 显示去掉边角之后的图像9 L. R2 j0 v4 n; C
title('螺纹波形')
: m: C$ y( J% m0 W" [
% K+ q7 D0 \0 x$ T9 B%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来
% ?9 r2 v: @* \: r" ]N=1; % 计数器& q* \9 i; v5 u, q! M$ d
for i=1:m 8 Y& G, Q4 X2 ]
for j=1:n
- W* Z! r9 u, A, k if I(i,j)==1
% C$ D: w# j7 s/ } x(N)=i; % 保存白色像素的横坐标 x
( V: \& `" m% P+ i7 } y(N)=j; % 保存白色像素的纵坐标 y
' l- c! Z1 E2 {1 R8 u5 S N=N+1; % 计数器 +17 I- J0 F! O O# ?/ t
end9 n! l! A5 L$ G3 f, S& _0 M
end
" l# o4 C- o( E- hend* S# }2 b. L+ w- B: l' D+ w& W# N" O
6 q" V# o# n4 r; m
[x,IX]=sort(x); % 将 x 按升序排列9 S6 d/ x' E- ^% n3 i# l
y=y(IX); % 对应的 y 顺序依次和 x 对应
* Y/ y) a7 u4 Y/ }9 Q% ], f, K% f; ~
subplot(1,3,3)+ Q! j/ {: x2 f6 D9 a- a! w; A
plot(x,y) % 绘制出螺纹轮廓波形
* o+ y# L7 c1 X7 y8 Sxlabel('横轴 x') 2 x$ ^1 A. V2 t
ylabel('纵轴 y')! K, V' P* `9 X* h5 W
title('螺纹识别结果'), \0 ~9 q$ R( R: H: ~2 ~# E& N# D
view([90 90])4 s) L6 }5 H; @+ a
hold on: p# A2 C, p( q# D8 G, i! V p
axis equal
R7 b$ f( n- {( s$ W0 xaxis([1 m 1 n])
9 d4 e0 }8 [/ W: E- C
6 S5 }: ~8 [* c%% 查找螺纹轮廓上的波峰点和波谷点1 q/ g" r7 ], t: c( B
M=14; % 设置螺纹的分段数* F2 B2 F5 I: w$ u
lengthxy=length(x); % 数据点的个数
; G* K, d. J' |% Vdlength=floor(lengthxy/M); % 将螺纹轮廓波形等分成 M 段, 每一段的长度
7 a' Y2 V) W6 R# O$ z5 o" f
% s+ c4 v9 ~+ V, o6 ?for k=1:M: r8 Y; {- R. q
xx{k}=x((k-1)*dlength+1:k*dlength); % 保存每一段的 x 值. F" `3 c1 d0 e7 D8 D- M! e5 h/ b$ u7 @
yy{k}=y((k-1)*dlength+1:k*dlength); % 保存每一段的 y 值
2 |; G. W/ }8 K8 y0 C% q% x! q9 b Vend
6 t" o, d6 Z; H( H% ?+ ]$ n- |+ l9 R$ c4 }" G# \! X
for k=1:M
5 V3 |* H2 g1 B3 s [bofengy(k),index1]=max(yy{k}); % 寻找每一段里 y 的最大值
7 o% r, m3 ~4 m) l. t( ^ bofengx(k)=xx{k}(index1); % 得到与波峰对应的横坐标 x: s* R- d4 z6 z" P2 P' f: X; R
[boguy(k),index2]=min(yy{k}); % 寻找每一段里 y 的最小值$ |* }) r! C3 I0 s
bogux(k)=xx{k}(index2); % 得到与波谷对应的横坐标 x
1 n- V9 O4 N* mend/ V$ B! }( p, t( J
scatter(bofengx,bofengy) % 绘制波峰点$ v$ E% h* M& n0 J5 ]" K
scatter(bogux,boguy,'k') % 绘制波谷点- W& d E* C( d+ Q; [$ ?
) L- G, h6 I5 h' F B. C- V
%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线1 j6 U* _+ o3 A5 L7 s
% 对波峰点进行直线拟合
) a u4 V! s8 dA1=[bofengx',ones(length(bofengx),1)];
+ U3 d% H9 W4 J s& Y2 `, Rkb1=A1\bofengy';4 J: K8 @( A3 U8 v$ n B2 \1 {
k1=kb1(1);
! q% `- J/ w! e, rb1=kb1(2);- I& Y. f' X; ^) L. Y. x
% ]8 ?5 M* c3 R- A3 z
% 绘制出波峰点的拟合直线
* N5 A: V5 o& u/ C+ o9 ]' vx0=[1 m];+ z2 Q% w0 E( D
Y1=k1*x0+b1; ' S7 @) {6 E( G% o1 R
plot(x0,Y1,'m');
. t; P- E/ m5 i$ `- f5 V0 I: s' ^2 ?/ W* V
% 对波谷点进行直线拟合4 @ D; A0 I3 W
A2=[bogux',ones(length(bogux),1)];0 K4 G7 ^1 ?* w7 t3 Y1 D
kb2=A2\boguy';9 o5 Y' a7 |; p- Z# y3 f2 l0 ^
k2=kb2(1);. F; q/ x. \$ I8 a# E; W' s
b2=kb2(2);
W& l3 P( J# h h
1 Z6 \: \& `- U/ M9 c% 绘制出波谷点的拟合直线' c' q9 M& Z* `
x0=[1 m];
+ k/ B; E1 @3 ]( U6 [Y2=k2*x0+b2;
8 D6 B. _- |% m& Eplot(x0,Y2,'r')
! ?" Y& B* U6 Y' p6 b6 h) A |
|