这是上学期数字图像处理的作业,老师要我们比较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); end end if(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('图像大小不正确'); end image=[]; 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)); end end image=uint8(image);
这样处理后就把图片合并出来了,在这两个函数中间就可以做些变换压缩之类的,恢复后和原图比较就可以知道压缩效果的好坏了。