找回密码
 注册
Simdroid-非首页
查看: 1420|回复: 31

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

[复制链接]
发表于 2009-12-28 19:37:57 | 显示全部楼层 |阅读模式 来自 黑龙江哈尔滨
本帖最后由 messenger 于 2009-12-30 04:15 编辑

基于MATLAB的图像数据提取


三石

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

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




1 原始图像

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



2 灰度图



2.2 图像滤波处理
2.2.1第一次滤波
由于网格值为221,第一次用阈值进行滤波,将阈值控制在10110之间,得到图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对图像数据进行提取,可以达到较高精度,并且实现了数据的自动提取和输出。限于目前知识,本程序还有值得改进的地方,下一步研究希望实现网格区域的自动识别,然后在该区域内应用本程序,实现数据全自动的识别与输出。
参考文献:
[1] 张汗灵.MATLAB在图像处理中的应用. 清华大学出版.北京:2008
[2] 阎光伟,胡海涛.扫描图像中时序曲线的识别及数据提取. 计算机研究与发. 2007251-256
[3] 张韫,刘冰,吴笛,张潇伊,杨芳,马宇晶.基于图像识别的心电监护数据提取技术. 医疗设备信息.2004:1911
[4] 中国天气网泰来县天气数据


附录--Matlab源程序
clc;
clear all;
k=input('Enter the file name','s');
im=imread(k);
im1=rgb2gray(im);
[sx sy]=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=[36 60        84 108        132        156        181        205        229        253        277        301        325        350        374        398        422        446        470        495        519        543        567        591        615];
zuobiaoy=[119 112 104        99        87        92        100        101        107        110        112        121        127        127        132        135        137        134        127        124        117        112        109        104        99];

for n=1:1:25
    wendu(n)=-((zuobiaoy(n)-18)/23*3+6);  
end
shijian=[9        10        11        12        13        14        15        16        17        18        19        20        21        22        23        0        1        2        3        4        5        6        7        8        9];

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',[1 0 0]);hold on;
plot(wenduzhun(:),'-','linewidth',1.5,'color',[0 0 1]);
xlabel('\rm(h)');
ylabel('\rm\circC');
set(gca,'xlim',[0 25]);
set(gca,'xtick',0:1:25);
set(gca,'XTickLabel',[9        10        11        12        13        14        15        16        17        18        19        20        21        22        23        0        1        2        3        4        5        6        7        8        9]);
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');

本帖子中包含更多资源

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

×

评分

1

查看全部评分

发表于 2009-12-28 19:40:37 | 显示全部楼层 来自 黑龙江哈尔滨
Simdroid开发平台
写的非常不错,可以发给我们期刊啊!
回复 不支持

使用道具 举报

发表于 2009-12-31 15:18:23 | 显示全部楼层 来自 哈尔滨工业大学
记得以前在matlab之家看到过类似的帖子,也是对bmp图像的读取,采取的也是根据灰度值进行处理,提取曲线上若干个点来拟合原图像中曲线。
有兴趣的自己找一下。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 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的图像例子是可以的!要是一张随便的图像,好像不一定有效果!
回复 不支持

使用道具 举报

发表于 2010-2-8 14:16:19 | 显示全部楼层 来自 台湾
类似方法好像见过几回了, 好像都是假设图像没歪斜
万一有歪斜怎处理?
回复 不支持

使用道具 举报

发表于 2010-2-15 08:31:55 | 显示全部楼层 来自 浙江温州
呵呵,我也遇到相似的问题,歪斜如何处理
回复 不支持

使用道具 举报

发表于 2010-3-15 20:22:19 | 显示全部楼层 来自 湖北宜昌
这个东西太好了

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-3-20 22:58:42 | 显示全部楼层 来自 陕西西安
不错不错,真是牛人,学习了

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-9-2 10:10:36 | 显示全部楼层 来自 广东广州
实在的东西啊
回复 不支持

使用道具 举报

发表于 2010-10-6 11:56:03 | 显示全部楼层 来自 黑龙江哈尔滨
图像的歪斜怎么处理啊 遇到这个问题了
回复 不支持

使用道具 举报

发表于 2011-1-13 11:44:33 | 显示全部楼层 来自 北京
倾斜了是不是可以归一化处理?
回复 不支持

使用道具 举报

发表于 2011-1-13 13:56:47 | 显示全部楼层 来自 浙江杭州
不错,学习学习

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-1-13 18:26:40 | 显示全部楼层 来自 北京
这个介绍的很详细,不错,支持楼主

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-2-10 13:08:59 | 显示全部楼层 来自 江西吉安
相当好的资料,谢谢了!
回复 不支持

使用道具 举报

发表于 2011-2-20 11:30:11 | 显示全部楼层 来自 上海长宁区
感谢LZ的慷慨提供的方法,而且免费,下载了好好学习一下。一直想从参考文献的图线中取出数据,这下可以试着用。
回复 不支持

使用道具 举报

发表于 2011-3-26 11:19:20 | 显示全部楼层 来自 上海松江区
谢谢楼主的经验分享 一直为阈值提取犯愁
回复 不支持

使用道具 举报

发表于 2011-4-16 16:29:42 | 显示全部楼层 来自 湖南长沙
相似的程序很多,本版就有一些,

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-4-17 21:08:12 | 显示全部楼层 来自 台湾
謝謝樓主 辛苦了
回复 不支持

使用道具 举报

发表于 2011-8-29 11:52:19 | 显示全部楼层 来自 浙江杭州
做数字图像相关的东西,对图像的东西很困惑啊,哎
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-25 17:10 , Processed in 0.078817 second(s), 23 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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