您的位置:首页 > 编程语言 > MATLAB

Matlab关于批量读取和存储图像这类问题的经验分享

2010-06-27 23:31 1001 查看
最近我在编程过程中遇到了需要批量读取和存储大量的图像的问题,在解决这个问题的过程中,我得到了论坛很多朋友(比如lyfbnc,qiqi版主等)和我身边同学的很多帮助,也有我自己的一些思考。现在我将这些归纳起来,与大家一起分享,相信对大家解决此类问题有一定的参考作用。

1.批量存储图像问题
为什么先将这个问题呢?因为在通常情况下,批量存储图像的时候,图像的命名是按照一定的规则进行的,比如依次命名为001.jpg,002.jpg.........,有了规则问题就相对简单了。 我们很容易想到这种情况下可以采用变量循环的方式来保存图像。 请大家先看这样一段程序:
clear all
f=imread('test.jpg');
for i=0:9
se = translate(strel(1), [2*i+1 2*i+3]); %依次将图像分别在x,y方向平移2*i+1 和2*i+3个像素
gi = imdilate(f,se);
x=strcat('newg',i);
y='jpg';
w=strcat(x,'.',y);
imwrite(gi,w);
end

这段程序很简单,目的是对图像f操作10次,每次分别在x,y方向平移2*i+1 和2*i+3个像素,存储图像时依次命名为
newg0.jpg,newg1.jpg.........。看起来很顺畅,但是执行起来会发现有错误,错误在于需要借助i值的改变来更新命名字符串:i是变量,是数值,而在命名的时候,i是需要以字符的形式出现的。所以正确的方法是将i由数值转换成字符,即将上面红色标示语句改成: x=strcat('newg',nun2str(i)); 这样程序就能顺利运行。这是很小的一个点,但是如果没有考虑到,就可能会出错。

2.批量读取图像的问题
(1) 如果是已知图像所在位置并且图像名称是有规律的,类似于001.jpg,002.jpg.........的,则通过一个循环就可以读进来,比如上面的例子,读取时的程序师这样的:
for i=0:9
gi=imread(strcat('newg', num2str(i),'.jpg'));
G(:,:,i+1)=gi;
end

依然需要注意抓换i的类型!
(2)如果是遇到图像位置已知(比如在D:/picture/test下),但是图像名称是无规律的,并且图像数目也未知的情况,这时的情况就复杂多了。在求助解决这个问题的时候,lyfbnc给出过这样的程序(请参考http://www.ilovematlab.cn/thread-50500-1-1.html):
cd ('D:/picture/test');
files=dir('*.jpg');
m=size(files,1);
G=zeros(256,256,m);%假设图像都是256*256大小,都是jpg格式的,并且test文件夹下除图像外不含其它文件
for i=1:m
G(:,:,i)=imread(files(i).name);
end

这个程序也不难,大家一看也就明白,也确实可以运行,但是有2点需要提醒大家注意:
A。上段程序顺利运行的前提是MATLAB的程序当前工作路径也是在D:/picture/test下。否则会由于cd命令而改变当前工作路径而引起错误。
B。大家如果查看files(i).name的值会发现,files(1).name,files(2).name的值分别是.和.. ,而files(3).name的值是Thumbs.db,从files(4).name开始才是我们想要的newg0.jpg,newg1.jpg......。这个问题在论坛有朋友已经提出过(具体在什么地方我忘记啦:( )。如果是直接这样存储的话,数组G的前3页将不是图像数据,会给后面的操作带来不便,所以我将此段程序稍微做了修改:
for i=4:m
G(:,:,i-3)=imread(files(i).name);
end
这样可以剔除与图像无关的数据和信息,后面对G的操作也将方便一些了。

上面所讲的是由程序直接读取图像,但是如果把这个问题拿到GUI里面来,似乎又有些麻烦了。比如我想通过点击一个按钮来浏览选择某个文件夹(这个文件夹很可能不在程序运行的当前路径下,而且是选择整个文件夹,不是再打开它选择它下面的某单帧图像)来批量读取这个文件夹下面的所有的图像,依然是图形名称无规律,数目未知(当然该文件夹下除了jpg格式的图像文件,并无其他),该怎么办呢?
在查阅资料、与同学反复思考讨论和尝试下,终于解决了这个问题。代码如下:

directoryname = uigetdir('', '请选择文件夹');%uigetdir函数可以浏览选择文件夹,更多信息请大家参阅uigetdir的
%帮助文件
files=dir(directoryname);
max=size(files,1);
G=zeros(256,256,max-3);
directoryname1=strcat(directoryname,'/');
for i=4:max
s=strcat(directoryname1,files(i).name);
G(:,:,i-3)=imread(s);
end

这段程序可以通过实现在所有磁盘空间一层层浏览打开文件夹来找到待读取图像所在的文件夹,也就是说最后打开的不是单图像,而是文件夹。这样可以轻松的读取某个文件夹下面的所有的图像。
http://www.ilovematlab.cn/thread-50894-1-1.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: