找回密码
 注册
关于网站域名变更的通知
查看: 447|回复: 1
打印 上一主题 下一主题

MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-17 10:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2020-3-17 17:43 | 只看该作者
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 00:52 , Processed in 0.140625 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表