這是上學期數位影像處理的作業,老師要我們比較dft,wht,dct種變換進行壓縮後的效果比較,鄙人熬了兩夜做了些小東西,為方便後人做的更好,也為了盡少周折,特上傳程式至此,程式品質很低,歡迎各位提出寶貴意見。
首先是圖片分割程式,有人用mat2cell之類的,因為cell概念還不是很清楚,我就用了很笨的方法做迴圈,將一個大的圖片處理後變成4維的數組,4維數組中前2維是圖片的橫縱左邊,後兩維是子圖片在大圖片的位置,由此實現圖片的分割。是不是很笨啊。
function sub_image=div_image(scr_image,SUBSIZE)% 功能:將scr_image按SUBSIZE*SUBSIZE大小分割% 輸入:scr_image:待處理的圖片,SUBSIZE子圖片大小% 輸出:sub_image:子圖片集合,p,q為序號% 注意:僅能處理二維圖片,即灰階級圖片% % Edit by lineter% QQ:542375845% Ningxia daxue% % 樣本:%% a=imread('jinbo.bmp');% a=rgb2gray(a);% b=div_image(a,16);% size(b)% % ans =% % 16 16 32 32% if(ndims(scr_image)==3) scr_image=rgb2gray(scr_image);end[x,y]=size(scr_image);for p=1:round(x/SUBSIZE) for q=1:round(y/SUBSIZE) sub_image(:,:,p,q)= ... scr_image(SUBSIZE*(p-1)+1:SUBSIZE*p,SUBSIZE*(q-1)+1:SUBSIZE*q); endendif(mod(x,SUBSIZE)~=0 || mod(y,SUBSIZE)~=0) disp('警告,圖片邊緣可能丟失!');end
很笨很笨的方法,有用內建函數實現分割的請告訴我,非常感謝。
對應的合并圖片方法如下:
function image=sum_image(div_image)% 功能:將scr_image合并成一張圖片% 輸入:scr_image:待處理的圖片集合% 輸出:sub_image:產生圖片% 注意:僅能處理二維圖片,即灰階級圖片% % Edit by lineter% QQ:542375845% Ningxia daxue% % 樣本:%% a=imread('jinbo.bmp');% a=rgb2gray(a);% b=div_image(a,16);% size(b)% % ans =% % 16 16 32 32% if(ndims(div_image)~=4) disp('映像格式錯誤,不是映像集合');end[x,y,m,n]=size(div_image);if(x~=y || m~=n) disp('映像大小不正確');endimage=[];for p=1:m for q=1:m image((x.*(p-1)+1):(x.*p),(x.*(q-1)+1):(x.*q)) = uint8( div_image(:,:,p,q)); endendimage=uint8(image);
這樣處理後就把圖片合并出來了,在這兩個函數中間就可以做些變換壓縮之類的,恢複後和原圖比較就可以知道壓縮效果的好壞了。