|
|
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 {
|
|