有一個圖像分塊的代碼,可以直接將一幅圖像分為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
最后,這個代碼的作用是批量處理一個文件夾里的圖像(進行圖像分塊),可以將分塊結果保存到每一個相應文件中如下:
(三張原圖批量分塊) 分塊結果如下: