为了提取运动物体的运动轨迹和运动状态的变化,首先需要获得运动体的轮廓,从而得到此时运动体的角度,速度等信息。
为了去除图像中明显的噪点,可采用图像平滑处理。 图像平滑的方法可分为频率域法(频率法)和空间域法(空域法)两类。频域法的处理基础是傅里叶变换和低通滤波技术,空域法的处理基础是模板卷积。 以下是几种平滑处理方法:
- 均值滤波【Simple Blurring】
- 中值滤波【Median Blurring】
- 高斯滤波【Gaussian Blurring】
- 双边滤波【Bilateral Blurring】
以高斯平滑为例: 1
2
3
4
5
6
7clear;
% 使用imread()函数读取图像
I1=imread('D:\uTorrent-NPUBits\MATLAB photo\T0-A60-P0.05\T0-A60-P0.0502005.tif');
%高斯平滑
h=fspecial('gaussian',7,2);
g=imfilter(I1,h,'conv');1
2% 图像边缘提取
bw1=edge(I,'canny');1
2
3
4
5
6
7
8
9
10sel1=strel('disk',1);
sel2=strel('disk',2);
% bw2=imfill(bw1,'hole');
% subplot(2,2,3),imshow(bw2);
% 图像膨胀与腐蚀操作
bw3=bwareaopen(bw1,25);
% subplot(2,2,4),imshow(bw3);
bw4=imdilate(bw3,sel2);
bw5=imerode(bw4,sel2);
bw6=bwareaopen(bw5,25);% 删除二值图像BW5中小面积对象1
2
3
4
5
6
7
8
9
10
11%提取模型身段边缘
bw6(800:1072,:)=0;
bw6(1:300,:)=0;
bw6(:,1:470)=0;
bw6(360:370,625:645)=0;
bw6(375:390,630:655)=0;
bw6(1:400,:)=0;
bw6(540:1072,:)=0;
figure
imshow(bw6);1
2
3
4
5
6
7% 写入dat文件
[R78,C78] = find(bw6);%返回一个包含数组bw6中每个非零元素的线性索引的向量。
fid = fopen('D:\uTorrent-NPUBits\MATLAB photo\T0-A60-P0.05\T0-A60-P0.0502005.dat','wt');
for i = 1:length(C78)
fprintf(fid,'%10.4f %10.4f \n',R78(i),C78(i));
end
fclose(fid);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44%放入原图作对比
figure
imshow(I1);
hold on
area=10*ones(length(C78),1);
scatter(C78,R78,area,'.','white');%scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形的散点图。该类型的图形也称为气泡图。
xlabel('R(mm)','fontsize',10);
ylabel('Depth(mm)','fontsize',10);
title('Outline scatter');
%大致找出模型轴线,并放入原图
x=0;
X=[];
Y=[];
for x=1:800
y=(2.25)*x-920;%修改一次项系数和常数项进行逼近
X(x)=x;
Y(x)=y;
end
area2=10*ones(length(X),1);
scatter(X',Y',area2,'.','white');
%提取较为清晰的直线段,在原图以红色标出
fid=load('D:\uTorrent-NPUBits\MATLAB photo\T0-A60-P0.05\T0-A60-P0.0502005.dat');
a1=fid(:,1);
a2=fid(:,2);
% figure
% plot(a2,a1,'.');%得到散点图
for i = 1:length(a2)
zhi=(2.25)*a2(i)-920;
if a1(i)>zhi
NC78(i)=a2(i);
NR78(i)=a1(i);
else
NC78(i)=0;
NR78(i)=0;
end
end
NC78(NC78==0) = [] ;
NR78(NR78==0) = [] ;
area3=10*ones(length(NC78),1);
scatter(NC78,NR78,area3,'.','red');1
2
3
4
5
6
7%对直线段进行拟合
figure
plot(NC78,NR78,'.');%得到散点图
hold on
p = polyfit(NC78,NR78,1);
NR781=polyval(p,NC78);
plot(NC78,NR781);
也可以利用霍夫变换(Hough Transform)直线检测: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49clear;
% 使用imread()函数读取图像
I1=imread('D:\uTorrent-NPUBits\MATLAB photo\T0-A60-P0.05\T0-A60-P0.0502005.tif');
%高斯平滑
h=fspecial('gaussian',7,2);
g=imfilter(I1,h,'conv');
I=im2bw(g,0.37);
% figure
% subplot(2,2,1),imshow(I);
% title('原始图像');
% 将索引彩色图象转换为灰度图像
% 图像边缘提取
bw1=edge(I,'canny');
% subplot(2,2,2),imshow(bw1);
% title('roberts');
sel1=strel('disk',1);
sel2=strel('disk',2);
% bw2=imfill(bw1,'hole');
% subplot(2,2,3),imshow(bw2);
% 图像膨胀与腐蚀操作
bw3=bwareaopen(bw1,25);
% subplot(2,2,4),imshow(bw3);
bw4=imdilate(bw3,sel2);
bw5=imerode(bw4,sel2);
bw6=bwareaopen(bw5,25);% 删除二值图像BW5中小面积对象
%提取模型身段边缘
bw6(800:1072,:)=0;
bw6(1:300,:)=0;
bw6(:,1:470)=0;
bw6(360:370,625:645)=0;
bw6(375:390,630:655)=0;
bw6(1:400,:)=0;
bw6(540:1072,:)=0;
figure
imshow(bw6);
% 这段注释是利用霍夫变换(Hough Transform)直线检测
[H, theta, rho]= hough(bw6,'RhoResolution', 0.5);
peak=houghpeaks(H,5);
hold on
lines=houghlines(bw6,theta,rho,peak);
figure,imshow(bw6,[]),title('Hough Transform Detect Result'),hold on
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',4,'Color',[.6 .6 .6]);
end