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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别
8 c  o3 j- E- z) c0 D5 n: I: u- `8 w9 ]8 g2 k
%% 读入原始的螺纹图片, 并显示5 k' y# n/ O8 j
clear;clc;close all
+ R. Q/ b. b  g% n& g, `$ ?  hI=imread('screw.bmp');$ _& `; \" G6 A- G
I=rgb2gray(I);
1 [( G* n3 @* {$ }: m$ @( u6 c: B! d6 w) T8 x
figure
; _3 V3 p/ x/ ~8 H5 ~subplot(1,3,1)
/ x8 y$ N1 o2 r: c/ Uimshow(I)
4 Z. D1 O2 Q& Q' A) b0 wtitle('螺纹原图')
( E- I: n9 Q) n% U; h. e; [/ T
0 g! M3 u! P( Lset(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]);  % 设置 figure 窗口的位置和尺寸
" P2 [; r  y0 V( B( G! t. t7 p) O7 Q3 H) i, X3 b
%% 对螺纹图片进行滤波处理, 并执行边缘检测
$ w3 M& ^7 l) f5 v2 ^7 SI=wiener2(I,[5 5]);      % 把原图里的噪声点滤去
& g  y* O* H# Z* C! }6 C& K: P& |/ j
I=edge(I,'canny');       % 边缘检测, 得到螺纹的轮廓波形1 F% r8 g- R+ b/ O) H
[m,n]=size(I);           % 计算图像的尺寸- s1 C% E* O" M  ~2 T# c

% _, `3 k; L) ~' I8 pI=I(20:m-20,20:n-20);    % 把图像的边角去掉, 仅留下有用的部分
3 F) h. g1 K% S6 ?[m,n]=size(I);           % 计算去掉边角之后的图像尺寸
7 w& e7 w- j/ ]8 i
% W& S9 t7 v- l  m" `subplot(1,3,2)
6 ]) c9 l) A5 o+ @! M! `- m. o: qimshow(I)                % 显示去掉边角之后的图像
7 I5 D3 G1 C' F! e* x/ }: S) Ltitle('螺纹波形')+ s. ~/ _8 k4 L
: s/ }/ I5 T5 Q" `" [
%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来4 b) |1 H' h( d# r( S
N=1;   % 计数器
& W' {' c3 o* Ofor i=1:m               ' Z7 ?( w! o5 B  v0 a: U
    for j=1:n4 l4 }$ ?1 t/ C8 U1 q% d0 D
        if I(i,j)==1      
7 s/ A' p+ O& j            x(N)=i;     % 保存白色像素的横坐标 x
) `& L4 O& b" d, e3 r7 @            y(N)=j;     % 保存白色像素的纵坐标 y
  m& n: v2 O) L/ ^# y5 F/ d            N=N+1;      % 计数器 +1- X) q& f3 p" g$ Q
        end* z9 |, Z1 ]* ~
    end$ }" h7 e# n% _1 r* x. v
end1 k& U2 Q% A: S- J, l

+ w9 V' P  ]/ N3 X& y; s  [: f[x,IX]=sort(x);    % 将 x 按升序排列8 G3 o) m% V" U- _1 r  b8 z
y=y(IX);           % 对应的 y 顺序依次和 x 对应
3 r; W% t9 v. C' X5 j, _5 J8 Z
- o) s- X" g; N9 }! D+ ^0 b; osubplot(1,3,3)
& k7 c8 v3 J! Zplot(x,y)          % 绘制出螺纹轮廓波形
; {. j+ s2 A% }6 W9 L& nxlabel('横轴 x')
3 W1 o+ i) Z9 A  i, @ylabel('纵轴 y')$ q  [" [8 d/ H, D4 I0 J/ a
title('螺纹识别结果')) R, M# B. U/ a2 ?7 q) m' F, F
view([90 90])7 O& E6 t5 ~. D5 i3 K0 [* j4 o
hold on! ?: `; _1 s) v: @2 `9 w
axis equal
- o  e$ R) ^; O8 Q, Eaxis([1 m 1 n])* H6 c7 Z1 L  [
/ B. |6 v! T9 E; K: {. e7 ]$ r8 p
%% 查找螺纹轮廓上的波峰点和波谷点
) f) z: T0 Q/ U9 }M=14;                        % 设置螺纹的分段数7 v1 H8 t$ i( t
lengthxy=length(x);          % 数据点的个数) f  a" K% `* M
dlength=floor(lengthxy/M);   % 将螺纹轮廓波形等分成 M 段, 每一段的长度
. `, C1 q% v5 f1 d0 x6 U* R/ C3 F" i" v  |
for k=1:M
( C5 ^: k; n7 Y2 u    xx{k}=x((k-1)*dlength+1:k*dlength);   % 保存每一段的 x 值- I4 e# h5 O& l0 J6 n
    yy{k}=y((k-1)*dlength+1:k*dlength);   % 保存每一段的 y 值/ X% [: b0 w9 P8 ]$ ]' B
end
2 h9 f- z0 ?. H
$ Q6 N; _5 r. a' D3 i" w9 B9 ?for k=1:M
' E/ L) P! _) E    [bofengy(k),index1]=max(yy{k});   % 寻找每一段里 y 的最大值5 |4 M8 e/ |6 h5 ]( ^( P5 ~
    bofengx(k)=xx{k}(index1);         % 得到与波峰对应的横坐标 x
4 S3 x& S" i9 A$ `. U    [boguy(k),index2]=min(yy{k});     % 寻找每一段里 y 的最小值
# Y/ N4 z. O7 ^  \# `8 _    bogux(k)=xx{k}(index2);           % 得到与波谷对应的横坐标 x# J) g/ b1 K- U# [7 L* a
end
$ H! H& I) ^& Bscatter(bofengx,bofengy)              % 绘制波峰点5 k8 a9 ^0 }* g5 K
scatter(bogux,boguy,'k')              % 绘制波谷点1 {' z$ {3 D5 m5 `2 h4 X) [1 a
% t$ K( U% ?& J$ d0 z4 ^3 \4 E
%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线
$ R+ Y3 v# ?! h5 w" v0 O/ y% 对波峰点进行直线拟合# P  a# L8 k0 j5 M  X! E0 [" e
A1=[bofengx',ones(length(bofengx),1)];  + K' a0 t0 ?. ]% C8 {
kb1=A1\bofengy';
0 v" f' p8 z& q: j$ }, gk1=kb1(1);( D* |1 V& h: x  N) ?
b1=kb1(2);
; [5 b0 V# G% f* K% C7 V7 r
+ R. x4 U+ ?2 G9 P% 绘制出波峰点的拟合直线
4 K8 o. g5 f" a9 c0 k. M- ?0 ax0=[1 m];
2 [$ J: h- r" R$ _) `, [% _. T/ OY1=k1*x0+b1;
/ K4 d* P( j$ H# R7 Tplot(x0,Y1,'m');# m) ?* X+ k4 t; }( X

, o0 V! n$ U# N& [4 u% 对波谷点进行直线拟合3 E: V6 d9 S4 Q+ R+ w
A2=[bogux',ones(length(bogux),1)];) i2 `9 H, g: A7 b4 A
kb2=A2\boguy';
2 ^4 _9 @" I" ?* Z" u* hk2=kb2(1);
0 C# q, S$ A  G6 c- a$ G8 `b2=kb2(2);$ {  I7 E6 D+ x5 @

- h, j" K. ]& `2 j3 f% 绘制出波谷点的拟合直线! K- T; K# p  m; \
x0=[1 m];. N1 q3 F" ~+ i9 k! I* i! `
Y2=k2*x0+b2;
  B! m; L% I' q6 oplot(x0,Y2,'r')2 o- S  D/ A; N: S1 c" R1 B) O

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-1 14:02 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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