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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别
" T, C: q# S& G3 W
7 \/ a6 ?  b  F, f: |%% 读入原始的螺纹图片, 并显示
1 [2 r6 Z) x4 H, _1 m2 eclear;clc;close all
2 j; m" U+ _. n& K* pI=imread('screw.bmp');
: b/ [3 x5 A# E- u8 `I=rgb2gray(I);' c$ b' d. D+ o' O! X6 P+ T

  d3 v6 Z/ q, i- f% S# bfigure' n7 h! O/ ^  h- p* o3 x
subplot(1,3,1)
- d5 O  U6 S! o5 ?7 i' Gimshow(I)$ S4 |7 d2 J9 d5 w+ @# o# _
title('螺纹原图')
6 h$ Z3 G2 q! w& s" o0 Z6 Z. |4 r& g
set(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]);  % 设置 figure 窗口的位置和尺寸
& |& k, _% j( y5 P+ U+ @: K1 m, `
' l2 c- V' i4 |' p/ m3 n# f+ R, j# @  H%% 对螺纹图片进行滤波处理, 并执行边缘检测
* m1 x( k/ k6 f( wI=wiener2(I,[5 5]);      % 把原图里的噪声点滤去
1 v" ]2 K% `" E3 ?
. J# S8 Z5 X8 Q; I1 RI=edge(I,'canny');       % 边缘检测, 得到螺纹的轮廓波形. J% Q" R: [' a& M* u* K
[m,n]=size(I);           % 计算图像的尺寸# N' L( v8 _1 m: l! w- B+ m- Z

0 |' a9 k: r. Q* X4 \. MI=I(20:m-20,20:n-20);    % 把图像的边角去掉, 仅留下有用的部分
( x* H9 g2 w$ o  B, f. m. N[m,n]=size(I);           % 计算去掉边角之后的图像尺寸' X" a4 ^: `6 v1 q! L( {1 P% |) p
' B) I* j3 b6 s7 l) ]
subplot(1,3,2)- p2 s4 e$ U4 V5 t/ d
imshow(I)                % 显示去掉边角之后的图像! t. i# u/ E+ ?) m+ N1 g
title('螺纹波形')9 I9 a: ?) I3 x( l3 B

3 D+ I+ ^) A6 J0 f9 l! z%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来8 }1 b' D) Q, b3 j
N=1;   % 计数器( H9 k5 K) o( o5 W+ D
for i=1:m               
  x& {7 a: ?7 v' l0 ]    for j=1:n
9 R; o: z* B5 }. C- O* b# x& z5 T        if I(i,j)==1      ! T0 r7 D6 b! ?$ l
            x(N)=i;     % 保存白色像素的横坐标 x/ [. z1 s* w( ^7 o; m8 E! [0 }7 O! z
            y(N)=j;     % 保存白色像素的纵坐标 y
& R$ }! }. N6 p/ y" Y4 q# y0 d            N=N+1;      % 计数器 +1, y2 ^* ]* o1 N* O# m# A
        end
7 X4 |; W6 n' F; c    end
0 ~' G/ ]9 W0 H' Lend! v! ?5 q! f3 H4 a/ [2 S

5 p. P; h2 v+ j1 m[x,IX]=sort(x);    % 将 x 按升序排列
/ o9 Q" j1 M; ]' F7 I2 wy=y(IX);           % 对应的 y 顺序依次和 x 对应  ?) O1 |' |8 @4 Y" Q9 F, s
" l0 W6 X- j  X1 k! n8 [
subplot(1,3,3)7 b& A7 R( L, X6 a+ T
plot(x,y)          % 绘制出螺纹轮廓波形* ^( k: b/ I) P
xlabel('横轴 x')
$ R# n0 l& Q8 V, H, c6 v7 Kylabel('纵轴 y')/ S+ h' f6 }9 g% E& M  \1 X
title('螺纹识别结果')
& ^- H8 [9 B0 {2 J! j9 r) hview([90 90])- X9 o. v- k$ f; S% c
hold on
( ?) Q5 x9 y- d. E; E, A' j7 Eaxis equal
' r" A) e4 j, _" K- N: saxis([1 m 1 n])6 Q" Y! @6 x. G: I1 \) B* |

- g6 S/ w1 ^( Y; p%% 查找螺纹轮廓上的波峰点和波谷点7 L$ |9 R3 z6 L" t4 A# o
M=14;                        % 设置螺纹的分段数% h( e+ v( U' I' y
lengthxy=length(x);          % 数据点的个数9 [/ {* d' d* g: e7 x/ P' @6 F& V
dlength=floor(lengthxy/M);   % 将螺纹轮廓波形等分成 M 段, 每一段的长度: _. A7 x2 {, u
: X7 t' h4 |% g0 G
for k=1:M
2 e0 k" a8 P1 r: J6 n( w    xx{k}=x((k-1)*dlength+1:k*dlength);   % 保存每一段的 x 值
% D2 a  l1 x  L' G    yy{k}=y((k-1)*dlength+1:k*dlength);   % 保存每一段的 y 值9 {" m% d& ?6 {
end: }1 C2 Y3 q; Z7 o2 W9 E  x

$ \+ ^8 X* q- c2 Mfor k=1:M
: E$ P. m1 b1 C( L5 d    [bofengy(k),index1]=max(yy{k});   % 寻找每一段里 y 的最大值
" l- A/ x1 |5 ~+ V+ d    bofengx(k)=xx{k}(index1);         % 得到与波峰对应的横坐标 x0 d/ h) i9 s1 C, N2 C. F/ J  K
    [boguy(k),index2]=min(yy{k});     % 寻找每一段里 y 的最小值
5 [" o0 [* \3 z2 @5 ^    bogux(k)=xx{k}(index2);           % 得到与波谷对应的横坐标 x
$ Y; S" X$ C& N" R) t/ `, G& U# jend$ ]- S" b# g! E% D6 x& k$ x* |
scatter(bofengx,bofengy)              % 绘制波峰点! j5 D. {' l3 ?  D# d
scatter(bogux,boguy,'k')              % 绘制波谷点
3 B5 _' |! \: @% x
5 v# L, H* W6 d, r/ O8 v* p0 k%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线8 a9 m, L! B7 V% e0 z
% 对波峰点进行直线拟合
' V, H; v8 T8 f& pA1=[bofengx',ones(length(bofengx),1)];  1 S4 w6 ~+ J, V+ O( u; ^8 o2 q
kb1=A1\bofengy';2 B; d# |0 r/ H- m9 y
k1=kb1(1);# g' O* ]& Z/ q
b1=kb1(2);4 {2 ~% @3 \. a  F' ^" j* `8 R
) u+ J4 ?# a: P7 K. q, g" j
% 绘制出波峰点的拟合直线
$ a3 [4 \& [( m$ c% C' dx0=[1 m];# E9 U* ]4 g: U! l7 J* b( u7 N
Y1=k1*x0+b1; ( s2 F* F# `- g0 C, |
plot(x0,Y1,'m');2 h2 _" u* i# ~, Z. a% n
' N8 \$ W& d3 G2 P" Q
% 对波谷点进行直线拟合6 G( ~0 @* Q' l0 [# ~
A2=[bogux',ones(length(bogux),1)];
0 ~% G. S; F+ ^. s+ V: z/ P! skb2=A2\boguy';
6 V3 t/ ^7 r  a3 vk2=kb2(1);8 I$ b' o6 ?) Z% |3 g+ E) Y* G
b2=kb2(2);' F/ @8 B( Y) f7 g
9 Q& ~! ?4 r" U
% 绘制出波谷点的拟合直线
7 b% t$ A0 H0 L; {3 L' I! ix0=[1 m];# u9 h- J  p) t& H6 p5 X
Y2=k2*x0+b2;
9 i7 V7 [* |; a! A3 i9 w. o3 Uplot(x0,Y2,'r')
& h7 d3 @" L( v9 W: E, E! g% w

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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