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