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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-4 12:45 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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