三石 发表于 2009-12-28 19:37:57

【原创】一个可以提取图像数据的MATLAB程序

本帖最后由 messenger 于 2009-12-30 04:15 编辑

基于MATLAB的图像数据提取

三石
摘要:MATLAB具有强大的图像处理功能,本文基于MATLAB编写图像处理程序,实现对图像数据的自动提取与输出,并达到较高精度。具有非常大的实际意义。

关键词:MATLAB;图像处理;数据提取
中图法分类号:                            文件标识码:
1 题目来源
MATLAB具有强大的图像处理功能,可以通过编写m文件实现操作的标准化。由于学术研究需要,笔者每天要登陆中国天气网读取泰来24小时内的温度、湿度、风速方向数据,全部数据达96个,而这些数据在网页上显示为flash,只能通过点击显示数据后抄取,非常麻烦。因此希望通过MATLAB图像处理功能对所截取的曲线图进行分析,自动完成各时刻数据的提取,并达到足够精度。
2 技术路线
如图1所示为所截取的某天24小时的温度变化曲线。可以看到,在各整点时刻,温度数据为一较大圆点,初步看来适合通过图像分析反算数据值。




图1 原始图像

2.1 原始图像读入
利用matlab命令imread()读入该图像,采用rgb2gray()将其转化为灰度图,如图2所示,为177*647的矩阵。分析该矩阵数据可以发现一些规律性的现象。如坐标轴刻度值,网格在矩阵中数据都有特定值。



图2 灰度图


2.2 图像滤波处理
2.2.1第一次滤波
由于网格值为221,第一次用阈值进行滤波,将阈值控制在10到110之间,得到图3。



图3 一次滤波图
2.2.2第二次滤波
从图3可以看到,滤波的结果将灰度图中的网格线去掉,并且数据线也只有在数据点附近有一些保留。为了只对数据点进行保留,需进行第二次滤波。此时数据点处具有表1所示规律性。

表1 某数据点灰度值

255

255

255

255

255

255

0

0

255

255

0

0

0

0

255

0

0

0

0

0

0

0

0

0

0

255

0

0

0

255

255

255

255

255

255

因此第二次滤波保留(i,j)=0&&(i-1,j)=0&&(i+1,j)=0&&(i,j-1)=0&&(i,j+1)=0的点位,得到图 4。




图4 二次滤波图
2.2.3第三次滤波
经过第二次滤波处理后还有部分点位处周边各点值为0,对其进行第三次处理:
if im3(i,j)==0
    im4(i,j)=(im3(i,j)+im3(i-1,j)+ im3(i+1,j)+im3(i,j-1)+im3(i,j+1))*0.2;
end
if im4(i,j)>=0 && im4(i,j)<=51
    im5(i,j)=0;
end
得到图 5:




图5 三次滤波图
2.3 记录灰度为0点的坐标
将上步得到图像中为0的点位坐标记录下来
if im5(i,j)==0
    zuobiao(m,1)=i;
    zuobiao(m,2)=j;
    m=m+1;
end
得到的是25个点的坐标数据,输出到excel如表2所示:

表2 各时刻点位数据

点位

1

2

3

4

5

6

7

8

9

10

11

12

13



119

112

104

99

87

92

100

101

107

110

112

121

127



36

60

84

108

132

156

181

205

229

253

277

301

325

点位

14

15

16

17

18

19

20

21

22

23

24

25





127

132

135

137

134

127

124

117

112

109

104

99





350

374

398

422

446

470

495

519

543

567

591

615




2.4 坐标转换成温度数值
按照图像中行数与坐标轴刻度关系推算各点位置与所代表实际数值的对应关系,本图中wendu(n)=-((zuobiaoy(n)-18)/23*3+6),于是得到从图像上获取的各时刻的温度数据。对比从中国天气网上抄取的各时刻数据,可见误差在0.2摄氏度以内,精度比较高。

表3 各时刻点位数据

时刻

9

10

11

12

13

14

15

16

17

18

准确值

-19.1

-18.2

-17.2

-16.4

-14.8

-15.5

-16.6

-16.7

-17.5

-17.8

图像值

-19.2

-18.3

-17.2

-16.6

-15.0

-15.7

-16.7

-16.8

-17.6

-18.0

时刻

19

20

21

22

23

0

1

2

3

4

准确值

-18.2

-19.2

-20.0

-20.1

-20.7

-21.1

-21.4

-21.0

-20.1

-19.8

图像值

-18.3

-19.4

-20.2

-20.2

-20.9

-21.3

-21.5

-21.1

-20.2

-19.8

时刻

5

6

7

8

9






准确值

-18.8

-18.2

-17.8

-17.1

-16.4






图像值

-18.9

-18.3

-17.9

-17.2

-16.6







图6所示为自动提取的温度曲线与实际温度曲线的比较,可以看到两条曲线几乎没差别。




图6 温度曲线图
3 结论
通过以上分析及图像处理过程可以发现通过MATLAB对图像数据进行提取,可以达到较高精度,并且实现了数据的自动提取和输出。限于目前知识,本程序还有值得改进的地方,下一步研究希望实现网格区域的自动识别,然后在该区域内应用本程序,实现数据全自动的识别与输出。
参考文献:
张汗灵.MATLAB在图像处理中的应用. 清华大学出版.北京:2008
阎光伟,胡海涛.扫描图像中时序曲线的识别及数据提取. 计算机研究与发. 2007:251-256
张韫,刘冰,吴笛,张潇伊,杨芳,马宇晶.基于图像识别的心电监护数据提取技术. 医疗设备信息.2004:19卷11期
中国天气网泰来县天气数据


附录--Matlab源程序
clc;
clear all;
k=input('Enter the file name','s');
im=imread(k);
im1=rgb2gray(im);
=size(im1);

im2=zeros(sx,sy)+255;
for j=1:sy
    for i=1:sx
      if im1(i,j)>=10 && im1(i,j)<=110
            im2(i,j)=0;
      end
   
    end
end
im3=zeros(sx,sy)+255;
for j=2:1:sy-1
    for i=2:sx-1
      if im2(i,j)==0 && im2(i-1,j)==0 && im2(i+1,j)==0 && im2(i,j-1)==0 && im2(i,j+1)==0
         im3(i,j)=im2(i,j);
      end      
    end
end
im4=zeros(sx,sy)+255;
for j=2:1:sy-1
    for i=2:sx-1
      if im3(i,j)==0
         im4(i,j)=(im3(i,j)+im3(i-1,j)+ im3(i+1,j)+im3(i,j-1)+im3(i,j+1))*0.2;
      end      
    end
end
im5=zeros(sx,sy)+255;
for j=2:1:sy-1
    for i=2:sx-1
      if im4(i,j)>=0 && im4(i,j)<=51
         im5(i,j)=0;
      end      
    end
end
m=1;
for j=2:1:sy-1
    for i=2:sx-1
      if im5(i,j)==0
         zuobiao(m,1)=i;
         zuobiao(m,2)=j;
         m=m+1;
      end      
    end
end

zuobiaox=;
zuobiaoy=;

for n=1:1:25
    wendu(n)=-((zuobiaoy(n)-18)/23*3+6);
end
shijian=;

figure,imshow(im1);
figure,imshow(im2);
figure,imshow(im3);
figure,imshow(im4);
figure,imshow(im5);

wenduzhun=[-19.1         -18.2         -17.2         -16.4         -14.8         -15.5         -16.6         -16.7         -17.5         -17.8         -18.2         -19.2         -20.0         -20.1         -20.7         -21.1         -21.4         -21.0         -20.1         -19.8         -18.8         -18.2         -17.8         -17.1         -16.4 ];
figure;
plot(wendu(:),'-','linewidth',1.5,'color',);hold on;
plot(wenduzhun(:),'-','linewidth',1.5,'color',);
xlabel('\rm(h)');
ylabel('\rm\circC');
set(gca,'xlim',);
set(gca,'xtick',0:1:25);
set(gca,'XTickLabel',);
set(gca,'ylim',[-24 -6]);
set(gca,'ytick',-24:3:-6);
set(gca,'YTickLabel',[-24 -21 -18 -15 -12 -9 -6]);

xlswrite('数据提取.xlsx',wendu,'提取的温度','A1');

敦诚 发表于 2009-12-28 19:40:37

写的非常不错,可以发给我们期刊啊!

zhuofeng 发表于 2009-12-31 15:18:23

记得以前在matlab之家看到过类似的帖子,也是对bmp图像的读取,采取的也是根据灰度值进行处理,提取曲线上若干个点来拟合原图像中曲线。
有兴趣的自己找一下。

messenger 发表于 2009-12-31 15:31:07

相似的程序很多,本版就有一些,如http://forum.simwe.com/thread-886047-1-1.html,但 lz 的程序比较系统、全面。

敦诚 发表于 2009-12-31 16:19:54

6# messenger 是的啊!这个程序可以省去很多数据抄写的过程 !这点很好,比如老美有很多数据都是图标,有时候就需要进行灰度转化来识别一下!当然这个程序也存在不足,比如图像选取的具有特殊性,lz的图像例子是可以的!要是一张随便的图像,好像不一定有效果!

ChaChing 发表于 2010-2-8 14:16:19

类似方法好像见过几回了, 好像都是假设图像没歪斜
万一有歪斜怎处理?

psteacher 发表于 2010-2-15 08:31:55

呵呵,我也遇到相似的问题,歪斜如何处理

sheshouafei 发表于 2010-3-15 20:22:19

这个东西太好了

lmhou2005 发表于 2010-3-20 22:58:42

不错不错,真是牛人,学习了

九天连 发表于 2011-9-2 10:10:36

实在的东西啊

liqionglin 发表于 2010-10-6 11:56:03

图像的歪斜怎么处理啊 遇到这个问题了

nuaaer 发表于 2011-1-13 11:44:33

倾斜了是不是可以归一化处理?

yt3699 发表于 2011-1-13 13:56:47

不错,学习学习

zhaosome 发表于 2011-1-13 18:26:40

这个介绍的很详细,不错,支持楼主

xixiaohua2005 发表于 2011-2-10 13:08:59

相当好的资料,谢谢了!

liuchanghong 发表于 2011-2-20 11:30:11

感谢LZ的慷慨提供的方法,而且免费,下载了好好学习一下。一直想从参考文献的图线中取出数据,这下可以试着用。

cat0924 发表于 2011-3-26 11:19:20

谢谢楼主的经验分享 一直为阈值提取犯愁

jswoo 发表于 2011-4-16 16:29:42

相似的程序很多,本版就有一些,

mtvmon 发表于 2011-4-17 21:08:12

謝謝樓主 辛苦了

d245062 发表于 2011-8-29 11:52:19

做数字图像相关的东西,对图像的东西很困惑啊,哎
页: [1] 2
查看完整版本: 【原创】一个可以提取图像数据的MATLAB程序