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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
MATLAB源程序代码分享:MATLAB图像处理实现螺纹的识别
3 l7 O/ a4 f, s( [
5 J' J" v6 ~* p; k6 A/ n%% 读入原始的螺纹图片, 并显示5 x' g0 b- [% x" e! ]4 ~. A6 F
clear;clc;close all
/ Z, g. X/ _5 `3 q  i2 {; {, GI=imread('screw.bmp');. @# l, r6 F- d! Y) R- j
I=rgb2gray(I);
/ o$ {2 u5 v: l$ }3 w) S; d
+ _1 m# `) B" [  [. G" l/ [  kfigure
3 \/ ~, q  q) A+ M( gsubplot(1,3,1)* X" y/ l: j! H7 }" U) x0 `) m
imshow(I)
+ s. [7 Z9 ?( H! a9 |1 htitle('螺纹原图')
! u* z0 S4 R( Y( X1 k
% |) h& I6 P  s, e* f' W$ Tset(gcf,'units','normalized','position',[0.2 0.2 0.6 0.6]);  % 设置 figure 窗口的位置和尺寸+ S: S' Y" o% m/ m& v' S
" \8 q3 R, F' t3 f( I
%% 对螺纹图片进行滤波处理, 并执行边缘检测" z( a( S3 g5 B/ a  ?
I=wiener2(I,[5 5]);      % 把原图里的噪声点滤去
; `6 x) {* X" t4 y4 b" s+ N& ?7 r  v
I=edge(I,'canny');       % 边缘检测, 得到螺纹的轮廓波形
  J. j# ]7 C- u, D+ Z[m,n]=size(I);           % 计算图像的尺寸' `9 A2 Q) U: v

# q8 n+ ]* u& `/ ^* VI=I(20:m-20,20:n-20);    % 把图像的边角去掉, 仅留下有用的部分
& R. U& s( d9 d' d8 A8 v, m3 `* t& D[m,n]=size(I);           % 计算去掉边角之后的图像尺寸
3 @- v; h8 |* [: |! J! \7 W  d! I% t0 L+ r# s/ b2 I6 y
subplot(1,3,2)( a& {( S3 C2 u* m  q3 l" I. ]: `1 c
imshow(I)                % 显示去掉边角之后的图像
- @$ p' j6 J' C5 G" Mtitle('螺纹波形')
2 H7 ~+ E/ P; v/ l! W5 S) r
# m; e6 m" x' [% U- ]%% 查找白色像素点的位置, 将螺纹轮廓的坐标点提取出来2 T9 c5 Q* W/ \6 p: L
N=1;   % 计数器
4 L6 @* P6 v/ a8 d/ `% \for i=1:m               : Q* l1 s2 C5 v! m! h
    for j=1:n2 Y6 C3 \- d: k( o
        if I(i,j)==1      " W% I6 ]% a& i; A
            x(N)=i;     % 保存白色像素的横坐标 x
  g/ C$ a  K7 {: b$ U            y(N)=j;     % 保存白色像素的纵坐标 y! C7 C  w* J2 Z5 E) |
            N=N+1;      % 计数器 +1
+ W$ f. }8 g; U3 B9 g# U        end+ m. N: F2 n. d
    end
: r& A7 K0 L% X: F! H  uend
) w, D: j1 c# H$ J$ B8 B* X' V; g5 l; T
% V& z( Z$ m' G) M7 a[x,IX]=sort(x);    % 将 x 按升序排列
: p( I. g; g: }, }0 py=y(IX);           % 对应的 y 顺序依次和 x 对应
- h+ Z1 D) G3 S* Z/ Y( U2 E2 f5 `1 q; `# V1 Q9 _
subplot(1,3,3)0 z5 Z2 D# M9 l* P8 [8 e7 U' K
plot(x,y)          % 绘制出螺纹轮廓波形; v$ R# B, ^3 |' Y# M( A4 W0 x! s
xlabel('横轴 x')
! F, r7 o. u# ]$ g& cylabel('纵轴 y')6 T2 _! d0 }2 E* X( `
title('螺纹识别结果')6 a* x' f- b5 V' d3 |9 w
view([90 90])
" M1 o+ ], d/ b) h" t( P0 ^6 phold on2 m+ r( V" J, ?6 h+ x
axis equal/ C5 Y, {( R7 d! R" x6 ^
axis([1 m 1 n])
: Y9 L1 i( @' V6 }) Z
% J2 Q( R% f0 h) w& r! _1 `5 h% h%% 查找螺纹轮廓上的波峰点和波谷点: O* l- r# }# N: n# f
M=14;                        % 设置螺纹的分段数
9 K% k. H3 y- s. Glengthxy=length(x);          % 数据点的个数; m* C8 B; H' H2 i& i9 t* b+ F, y
dlength=floor(lengthxy/M);   % 将螺纹轮廓波形等分成 M 段, 每一段的长度: d5 w5 b. c; i4 Z" F1 j' B& z1 A

7 f" r- ^# ]6 u% f2 ^% u( xfor k=1:M4 @, ?! ], z0 t' e# p4 k# ]1 t
    xx{k}=x((k-1)*dlength+1:k*dlength);   % 保存每一段的 x 值4 g" m9 I( [1 e6 l( I
    yy{k}=y((k-1)*dlength+1:k*dlength);   % 保存每一段的 y 值
) e/ m- F" J1 oend/ C7 O1 K5 V2 \5 a+ j

& I: w6 j0 o' }+ _: Xfor k=1:M7 C6 C( p7 Y: h7 y% O/ N
    [bofengy(k),index1]=max(yy{k});   % 寻找每一段里 y 的最大值
% z7 E0 Z" N7 M1 _    bofengx(k)=xx{k}(index1);         % 得到与波峰对应的横坐标 x6 S: T- y5 Z. `$ A1 B
    [boguy(k),index2]=min(yy{k});     % 寻找每一段里 y 的最小值
; u9 _$ W7 _& Q1 q    bogux(k)=xx{k}(index2);           % 得到与波谷对应的横坐标 x8 K' Y* s5 \3 H
end
% {- q5 Z0 P% fscatter(bofengx,bofengy)              % 绘制波峰点
5 N  Y' x; r, uscatter(bogux,boguy,'k')              % 绘制波谷点  X. F$ T# h3 J- y. E" |% p

! {3 Z4 Q  q( L4 P+ s7 X%% 分别对波峰点和波谷点, 执行直线拟合, 得到螺纹轮廓的两条包络线
! j4 ?; E  y8 i' A/ f% 对波峰点进行直线拟合! Y/ o2 T. t/ h
A1=[bofengx',ones(length(bofengx),1)];  
( g) o3 Y! E! h# v! p& ^2 Bkb1=A1\bofengy';
: n; Q8 F. Y) T" ~k1=kb1(1);. `/ ?) |( a2 E% W* L5 W5 g  Q% H
b1=kb1(2);
! u. c) Q* F6 }% D" ^2 d
8 j9 \& E, h! L& _* q- q+ e2 h% 绘制出波峰点的拟合直线3 I% \* `# j% j( s9 {; q8 Q9 i, m# v
x0=[1 m];: I' F4 s3 ^3 q( v
Y1=k1*x0+b1;
; [0 f6 E5 k8 B; v$ ?plot(x0,Y1,'m');
+ D: H* N' d) T! ^" T7 R+ \+ B8 e% d- A9 E" Z# J
% 对波谷点进行直线拟合
5 z0 O5 f& O6 ?A2=[bogux',ones(length(bogux),1)];! K* `* v$ [3 h# E& Q( \6 O
kb2=A2\boguy';9 e3 z- `2 M) U5 ]* Y
k2=kb2(1);
/ e" [; b" @9 o2 Fb2=kb2(2);* j! A$ z, _0 N/ l! K# q

2 i0 r$ u0 C. w7 ~! z+ K% 绘制出波谷点的拟合直线7 y7 K" X8 N. g* M0 H' E5 [  F
x0=[1 m];
5 [# `+ P2 m/ }. T. GY2=k2*x0+b2;
+ A& b  b6 C2 v3 T5 }plot(x0,Y2,'r'). F& T! w6 D2 {

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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