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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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