matlab处理:批处理图像分块
有一个图像分块的代码,可以直接将一幅图像分为5*5的小块,代码如下:
%[FileName,PathName] = uigetfile('*.*','Select the image'); Im=imread('Bicubic flowers.bmp'); imshow(Im) hold on L = size(Im); height=5; width=5; max_row = floor(L(1)/height);%实验图片为800*1280,则max_row=5,max_col=8 max_col = floor(L(2)/width); seg = cell(max_row,max_col); %分块 for row = 1:max_row for col = 1:max_col seg(row,col)= {Im((row-1)*height+1:row*height,(col-1)*width+1:col*width,:)}; end end for i=1:max_row*max_col imwrite(seg{i},strcat('m',int2str(i),'.bmp')); %把第i帧的图片写为'mi.bmp'保存 end %画出分块的边界 for row = 1:max_row for col = 1:max_col rectangle('Position',[160*(col-1),160*(row-1),160,160],... 'LineWidth',2,'LineStyle','-','EdgeColor','r'); end end hold off
怎么直接把一个文件夹里的所有图片都按这个分块方法进行分类并保存结果呢?开始我想的是直接用一个循环结构就可以了,但是后来发现最后的结果不对,好几张图片分类最后的小图片数量不够,试了几次才发现是命名相同的问题,循环里最后保存的每个大图的小图片的名字是一样的,所以后面的把前面产生的小图像给覆盖掉了,然后就想办法,每个循环都建立一个文件夹,来分开保存每个大图的小图片,这样问题就解决了。代码如下:
srcDir=uigetdir('Choose source directory.'); %获得选择的文件夹 cd(srcDir); %mkdir('.\image') allnames=struct2cell(dir('*.bmp')); %只处理8位的bmp文件 [k,len]=size(allnames); %获得bmp文件的个数 for ii=1:len %逐次取出文件 mkdir(['.\image\',int2str(ii)]); name=allnames{1,ii}; Im=imread(name); %读取文件 %然后在此处添加你的图像处理程序即可 L = size(Im); height=5; width=5; max_row = floor(L(1)/height);%实验图片为800*1280,则max_row=5,max_col=8 max_col = floor(L(2)/width); seg = cell(max_row,max_col); %分块 for row = 1:max_row for col = 1:max_col seg(row,col)= {Im((row-1)*height+1:row*height,(col-1)*width+1:col*width,:)}; end end for i=1:max_row*max_col imwrite(seg{i},strcat('image\',int2str(ii),'\','m',int2str(i),'.bmp')); %把第i帧的图片写为'mi.bmp'保存 end %画出分块的边界 for row = 1:max_row for col = 1:max_col rectangle('Position',[160*(col-1),160*(row-1),160,160],... 'LineWidth',2,'LineStyle','-','EdgeColor','r'); end end end
最后,这个代码的作用是批量处理一个文件夹里的图像(进行图像分块),可以将分块结果保存到每一个相应文件中如下:
(三张原图批量分块) 分块结果如下: