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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别
2 X* _. S' m5 w8 d" r5 z/ D1 o
. Z9 r( L$ z' a) [1 w%% 读入原始的螺纹图片, 并显示
! {6 x; f  T6 a* Z/ s& qclear;clc;close all' f% B3 K* S4 B2 q5 G4 x7 a
I=imread('screw.bmp');
0 g* r% }$ k1 R% o* S% q7 y7 lI=rgb2gray(I);
7 O$ `3 J  [: E4 u
. \( @6 D, f# ]' y' Rfigure* I. X2 b9 ?, u$ {) v7 ~
subplot(1,3,1)& x; w4 K4 I, F2 N; r0 ^
imshow(I)9 x8 h; T( S) u, H
title('螺纹原图')
# u8 O+ Y6 T1 s% M* v" H$ m9 L% @
set(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]);  % 设置 figure 窗口的位置和尺寸
. c* `( q9 ^. `8 z. J& F3 c7 v' b
; f/ f/ O3 c, }% G( V%% 对螺纹图片进行滤波处理, 并执行边缘检测
  f! m' w  [) w: f+ BI=wiener2(I,[5 5]);      % 把原图里的噪声点滤去6 k( A1 a- H9 g) m2 S5 W. Q  ^
' B& L5 B& U# W( [, a
I=edge(I,'canny');       % 边缘检测, 得到螺纹的轮廓波形
, w8 W* ?! I2 l& K* k+ X[m,n]=size(I);           % 计算图像的尺寸2 I( X. N( s1 z- |2 ]3 P
7 K' B1 K  v8 y5 B7 a% p
I=I(20:m-20,20:n-20);    % 把图像的边角去掉, 仅留下有用的部分$ B7 C3 f- |% b# C9 D: i
[m,n]=size(I);           % 计算去掉边角之后的图像尺寸
5 t* a4 S$ p. g3 \
4 l! s0 q+ m0 _  W7 P) wsubplot(1,3,2)
: Q2 W! t6 Z5 qimshow(I)                % 显示去掉边角之后的图像
# ]' D  N+ D2 E( S: V1 Otitle('螺纹波形')
2 I, ^) T: T; z# Q# V% D7 t5 O" V) f
%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来
$ @6 g7 w' B% i6 L1 GN=1;   % 计数器
* }4 h! q$ K0 d7 Q0 rfor i=1:m               
* |9 m) s+ {4 y) a# D$ ?9 F    for j=1:n
9 y; j* H( P9 p7 t4 N        if I(i,j)==1      
+ y6 e. ]: L2 O- [& |# D            x(N)=i;     % 保存白色像素的横坐标 x
, o8 K' e6 I1 K" _, s            y(N)=j;     % 保存白色像素的纵坐标 y2 t/ o& k% Y) v2 I
            N=N+1;      % 计数器 +1
" m0 ]% g' p# k6 @( P        end
! j( Q/ s  q; u- ], V4 x& [    end6 g) X5 `: O/ M  t' n0 v6 F
end
2 u7 e& \5 d6 N" k' S# B7 K2 X
" ^! H0 X/ k5 B% n  \0 N! @[x,IX]=sort(x);    % 将 x 按升序排列
# E4 c( P7 M; ]2 \9 L, N3 {6 Oy=y(IX);           % 对应的 y 顺序依次和 x 对应; B. e; M3 F. j" ^& m$ R
" p. w. A$ w2 ?9 P: U9 J
subplot(1,3,3)- `1 R; Q* ?0 G# B0 X
plot(x,y)          % 绘制出螺纹轮廓波形- |" P: K% I4 W3 v+ y4 ]
xlabel('横轴 x') . g6 x3 i. ]! N2 l6 H/ l' C" a+ T
ylabel('纵轴 y')
* S4 b3 ?9 R. Stitle('螺纹识别结果')7 W" W5 q; D- H0 w  Y
view([90 90])# s' Q; T2 s% r# g9 J1 F
hold on
! a8 j' @3 D+ }4 R% yaxis equal
; p/ g( a+ d0 A3 |axis([1 m 1 n])
7 Z( l9 [2 ?' [3 `, o  L8 A& g3 K2 ?/ W
%% 查找螺纹轮廓上的波峰点和波谷点
* B& A$ a2 [$ j7 q1 S3 UM=14;                        % 设置螺纹的分段数
: u8 z; i$ C& s# b+ ^lengthxy=length(x);          % 数据点的个数
" M5 q& A0 j5 L/ r& \1 Ddlength=floor(lengthxy/M);   % 将螺纹轮廓波形等分成 M 段, 每一段的长度- F' t! l  N( ?# V6 W0 l

  S5 ~8 ]$ O  r8 afor k=1:M
' V3 t) l- \- N7 E; B    xx{k}=x((k-1)*dlength+1:k*dlength);   % 保存每一段的 x 值; s9 Y$ H) D8 y* W9 ^5 |- o
    yy{k}=y((k-1)*dlength+1:k*dlength);   % 保存每一段的 y 值
" ?1 ]1 {3 d5 b: |" \- V' M# Aend: Z" ~% f) e# c/ |& O- p! W

- B  ~  q3 `( S* H: a' Xfor k=1:M0 {2 t# w" j% l. X6 [% P# \+ g8 X, ~
    [bofengy(k),index1]=max(yy{k});   % 寻找每一段里 y 的最大值
3 y3 W& }7 x. w% Z$ P' {/ t    bofengx(k)=xx{k}(index1);         % 得到与波峰对应的横坐标 x
7 M8 E& o' j$ F, U/ L+ }# B    [boguy(k),index2]=min(yy{k});     % 寻找每一段里 y 的最小值* m# n+ x, p* m) K6 s. k- n
    bogux(k)=xx{k}(index2);           % 得到与波谷对应的横坐标 x1 }& y4 W2 t5 C0 s! X
end) o5 K& v' {8 k% I$ [" P
scatter(bofengx,bofengy)              % 绘制波峰点
2 ^; N  p: W0 Iscatter(bogux,boguy,'k')              % 绘制波谷点9 L" l' |6 N' d+ V

0 Z# f% p3 m' f: W%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线5 v  t+ N: D$ ^9 B, [
% 对波峰点进行直线拟合
5 ~; M3 X# ~9 }: S3 P5 l0 \A1=[bofengx',ones(length(bofengx),1)];  
1 o+ |# i: p3 }- ~2 I0 G% Wkb1=A1\bofengy';
9 Y1 }- c2 I# s! s- @k1=kb1(1);
) _( @1 W) L- q. A7 bb1=kb1(2);
5 O: C8 d, n1 `1 ?' x
) I2 ~2 }: E" V. @+ j( L8 w/ i% 绘制出波峰点的拟合直线
( ^# M( \) ^: c9 ix0=[1 m];
4 ]( |) E4 y+ f1 ?Y1=k1*x0+b1;   W% t* C( s& C( D
plot(x0,Y1,'m');  \" M( p6 k0 X% W1 m

2 ^+ e& i6 e: M0 `( H  S) M4 Z( `" U! b$ }% 对波谷点进行直线拟合. x, L$ F+ ?5 V, h3 u) ]
A2=[bogux',ones(length(bogux),1)];
- ?& n# i& [1 Z- l* ^kb2=A2\boguy';
9 d* L# b0 p( h- q2 tk2=kb2(1);
- p' B- j1 X( L# q! P5 Tb2=kb2(2);
, ]! c' W, M1 Y0 {$ ~8 |6 l6 g6 s. N2 ^9 j! \( y2 x5 I. i
% 绘制出波谷点的拟合直线
% l3 @# S6 ^1 x$ R7 D) ^x0=[1 m];
1 N7 g4 \: U* wY2=k2*x0+b2; , T3 B  F$ w. L6 y* {6 D0 T
plot(x0,Y2,'r')* v; H2 t+ e3 u; y: k1 y  e! i8 n

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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