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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 04:12 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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