| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别0 t" A. A! C: q' S 
 
! |% C+ V) u/ T$ v  M; P( s%% 读入原始的螺纹图片, 并显示. {$ O0 w+ a( Y$ f5 ]% b 
clear;clc;close all 
5 d' q' O6 |- q' u) BI=imread('screw.bmp');) f1 {# E" y% \# l8 W% R8 @1 T 
I=rgb2gray(I); 
6 M2 i3 M: R  Z' p 
/ T  w! l2 w' ?( ?2 ~: \$ gfigure$ d. t4 {4 p8 l3 i7 j 
subplot(1,3,1) 
% ^3 l, c( [9 U; p4 @8 oimshow(I) 
3 O; g3 C/ [6 }2 k% N6 G5 y! Vtitle('螺纹原图')2 z! ]  M  v3 }# e4 F/ @ 
 
% g5 c4 j# {/ C% }set(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]);  % 设置 figure 窗口的位置和尺寸 
- x: @- M: d9 R+ p$ b. T$ Y$ i* c5 T, A2 R8 M 
%% 对螺纹图片进行滤波处理, 并执行边缘检测 
* z5 R& T$ C4 h, G4 J& {+ cI=wiener2(I,[5 5]);      % 把原图里的噪声点滤去 
3 ~# a  ~0 V* L0 f+ | 
4 z" L* R7 w0 oI=edge(I,'canny');       % 边缘检测, 得到螺纹的轮廓波形 
; V: Z/ g. F6 {& {$ h+ o[m,n]=size(I);           % 计算图像的尺寸 
. m' r' `9 y- F7 | 
( \. i- F  C: T0 kI=I(20:m-20,20:n-20);    % 把图像的边角去掉, 仅留下有用的部分 
4 `9 ^& O' R. P" s& K/ X/ j[m,n]=size(I);           % 计算去掉边角之后的图像尺寸# a8 A; D8 p, C 
 
9 H# Q8 T; K/ u2 F1 i* L4 asubplot(1,3,2)  [& U: U( W& ^$ _ 
imshow(I)                % 显示去掉边角之后的图像; x8 F# c# K5 K9 m1 c$ k5 p 
title('螺纹波形') 
# |) q6 k0 [/ j% }8 h. T: `. Y& D$ @" B1 A4 I 
%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来- M: V1 `% T9 w& `( Y, K 
N=1;   % 计数器 
; q8 W. `( b1 N$ Y5 N, q% H/ \for i=1:m                
) w" [! n; V6 P# ^    for j=1:n5 g+ |6 d9 a& u: k1 \% x 
        if I(i,j)==1      * K' y- z: ~3 S6 h0 m 
            x(N)=i;     % 保存白色像素的横坐标 x 
7 d) I  u" G2 p& s; U. A            y(N)=j;     % 保存白色像素的纵坐标 y 
! }. p9 n, {& Z0 f$ d# t/ x( O            N=N+1;      % 计数器 +1: u0 p/ m" z9 Y" i8 \ 
        end 
# k6 B3 m, Z2 i9 J7 a( p    end 
  U4 M2 P. P- \4 l1 h9 }" a# iend* B0 q  r: S1 b: N 
 
  D# y1 {  x8 f7 }8 s$ p1 @2 P[x,IX]=sort(x);    % 将 x 按升序排列+ ?: d8 W4 f+ U! D' e4 U3 j$ b. P 
y=y(IX);           % 对应的 y 顺序依次和 x 对应8 r- D( S' h5 D9 i 
 
% x+ m5 `% F" `7 d( f: [subplot(1,3,3) 
$ J* H  d5 _- v! Rplot(x,y)          % 绘制出螺纹轮廓波形5 y; [/ ]* Y" M6 l* X" T8 D 
xlabel('横轴 x') 1 @3 X" `- I& E& b  a. [ 
ylabel('纵轴 y')7 \6 n' ?  @  l5 F. \- d8 k& @ 
title('螺纹识别结果') 
/ J  ?# H3 `7 z6 ]8 N- bview([90 90]) 
7 I; f9 P4 n/ S% C# M7 xhold on 
, h7 c1 `- X0 l! U$ E: g. p5 ^axis equal: J" y, E% C8 ^% {- s& h; ]% h 
axis([1 m 1 n]): u" G9 |' D5 G/ q 
 
. n4 b( ~# Y1 f3 G* h1 d%% 查找螺纹轮廓上的波峰点和波谷点' z9 \' x3 g8 u4 ?1 ^" L) f 
M=14;                        % 设置螺纹的分段数 
% {( N0 G* V2 o. Wlengthxy=length(x);          % 数据点的个数 
, H* v' d: W/ s7 B$ [! Jdlength=floor(lengthxy/M);   % 将螺纹轮廓波形等分成 M 段, 每一段的长度, E1 ^1 E* s1 ]& s! [2 k 
0 p: g' N, p+ s% ~% Z 
for k=1:M" _, k" @- B: Z/ J' L 
    xx{k}=x((k-1)*dlength+1:k*dlength);   % 保存每一段的 x 值: m5 G- j  n8 V% _; M  O* x# i! | 
    yy{k}=y((k-1)*dlength+1:k*dlength);   % 保存每一段的 y 值 
2 d/ P) ^! S2 ~3 Lend 
$ e) z3 H) c# H4 _ 
9 U- D% ^1 z3 m- \8 m# |! ~for k=1:M7 k* h0 u1 ?9 t8 B7 p 
    [bofengy(k),index1]=max(yy{k});   % 寻找每一段里 y 的最大值 
! r2 X- b4 r0 u( a% [4 g    bofengx(k)=xx{k}(index1);         % 得到与波峰对应的横坐标 x: t- B" L& G; |/ Z& y 
    [boguy(k),index2]=min(yy{k});     % 寻找每一段里 y 的最小值 
7 e, y. b& e/ \9 Z9 g2 }3 C    bogux(k)=xx{k}(index2);           % 得到与波谷对应的横坐标 x 
8 s* l- I, s) A/ ^/ G) Vend8 P! H0 L" f7 C  i/ J 
scatter(bofengx,bofengy)              % 绘制波峰点: j7 j1 Z8 ]9 L 
scatter(bogux,boguy,'k')              % 绘制波谷点7 G! @7 a) i+ n1 ]+ U- }0 ~. m: } 
& H# W( R4 g5 b, c8 w2 ~7 ^7 ~* O8 R+ z 
%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线 
# C* q4 ?! Y7 m6 K9 Z% 对波峰点进行直线拟合5 u( s1 d. e& v 
A1=[bofengx',ones(length(bofengx),1)];  4 A+ j6 ?. x. i! f0 q3 J8 C1 r 
kb1=A1\bofengy'; 
* H5 t7 [$ Y( y. ?k1=kb1(1); 
! k6 o2 q8 ~6 W+ jb1=kb1(2); 
$ v; s" g9 o: c0 T) W  v" N2 Y0 `" P6 R 
% 绘制出波峰点的拟合直线. y- ]4 v# N  O. }+ z 
x0=[1 m]; 
0 o4 d" j( G& t, eY1=k1*x0+b1;  
$ T  D( Y$ H4 \# A. f4 D; hplot(x0,Y1,'m'); 
! r0 q/ Z: n& C. _& n/ M1 h5 ^" T6 \" p 
% 对波谷点进行直线拟合 
' b7 _9 I/ a2 [# s7 ?' KA2=[bogux',ones(length(bogux),1)]; 
* a+ _5 S1 O% C  }1 E7 Vkb2=A2\boguy'; 
* _& A. o) Q. V2 B! |2 u# O- ek2=kb2(1); 
. E0 }1 f) W  l) ?b2=kb2(2);+ P; K8 y5 ^6 \: Y+ K 
. ?3 b% t, E7 V- M: u2 D5 m% a 
% 绘制出波谷点的拟合直线! Q7 D3 ?  G, s 
x0=[1 m]; 
! b/ Y/ l( ~; W- k" ~+ }' K/ hY2=k2*x0+b2;  
0 T- t$ X. h  n. _  K% F* u7 \, |plot(x0,Y2,'r'): K+ l" ^; L4 g! d 
 |   
 
 
 
 |